百科解釋
Linux C函數(shù)[編輯本段]connect(建立socket連線)
相關(guān)函數(shù)
socket,bind,listen
表頭文件
#include<sys/types.h>
#include<sys/socket.h>
定義函數(shù)
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
函數(shù)說(shuō)明
connect()用來(lái)將參數(shù)sockfd 的socket 連至參數(shù)serv_addr 指定的網(wǎng)絡(luò)地址。結(jié)構(gòu)sockaddr請(qǐng)參考bind()。參數(shù)addrlen為sockaddr的結(jié)構(gòu)長(zhǎng)度。
返回值
成功則返回0,失敗返回-1,錯(cuò)誤?虼嬗趀rrno中。
錯(cuò)誤代碼
EBADF 參數(shù)sockfd 非合法socket處理代碼
EFAULT 參數(shù)serv_addr指針指向無(wú)法存取的內(nèi)存空間
ENOTSOCK 參數(shù)sockfd為一文件描述詞,非socket。
EISCONN 參數(shù)sockfd的socket已是連線狀態(tài)
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操作超過(guò)限定時(shí)間仍未有響應(yīng)。
ENETUNREACH 無(wú)法傳送數(shù)據(jù)包至指定的主機(jī)。
EAFNOSUPPORT sockaddr結(jié)構(gòu)的sa_family不正確。
EALREADY socket為不可阻斷且先前的連線操作還未完成。
范例
/* 利用socket的TCP client
此程序會(huì)連線TCP server,并將鍵盤輸入的字符串傳送給server。
TCP server范例請(qǐng)參考listen()。
*/
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define PORT 1234
#define SERVER_IP “127.0.0.1”
main()
{
int s;
struct sockaddr_in addr;
char buffer[256];
if((s = socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
/* 填寫sockaddr_in結(jié)構(gòu)*/
bzero(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr = inet_addr(SERVER_IP);
/* 嘗試連線*/
if(connect(s,&addr,sizeof(addr))<0){
perror(“connect”);
exit(1);
}
/* 接收由server端傳來(lái)的信息*/
recv(s,buffer,sizeof(buffer),0);
printf(“%s
”,buffer);
while(1){
bzero(buffer,sizeof(buffer));
/* 從標(biāo)準(zhǔn)輸入設(shè)備取得字符串*/
read(STDIN_FILENO,buffer,sizeof(buffer));
/* 將字符串傳給server端*/
if(send(s,buffer,sizeof(buffer),0)<0){
perror(“send”);
exit(1);
}
}
}
執(zhí)行
$ ./connect
Welcome to server!
hi I am client! /*鍵盤輸入*/
/*<Ctrl+C>中斷程序*/