相關函式

socket,bind,listen
表頭檔案
#include<sys/types.h>
#include<sys/socket.h>
定義函式
intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);
函式說明
connect()用來將參數sockfd的socket連至參數serv_addr指定的網路地址。結構sockaddr請參考bind()。參數addrlen為sockaddr的結構長度。
參數
參數一:套接字描述符
參數二:指向數據結構sockaddr的指針,其中包括目的連線埠和IP位址
參數三:參數二sockaddr的長度,可以通過sizeof(structsockaddr)獲得
返回值
成功則返回0,失敗返回非0,錯誤碼GetLastError()。
錯誤代碼

EFAULT參數serv_addr指針指向無法存取的記憶體空間
ENOTSOCK參數sockfd為一檔案描述詞,非socket。
EISCONN參數sockfd的socket已是連線狀態
ECONNREFUSED連線要求被server端拒絕。
ETIMEDOUT企圖連線的操作超過限定時間仍未有回響。
ENETUNREACH無法傳送數據包至指定的主機。
EAFNOSUPPORTsockaddr結構的sa_family不正確。
EALREADY socket為不可阻斷且先前的連線操作還未完成。
範例
/*利用socket的TCPclient
此程式會連線TCPserver,並將鍵盤輸入的字元串傳送給server。
*/
#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>
#definePORT1234
#defineSERVER_IP“127.0.0.1”
main()
{
ints;
structsockaddr_inaddr;
charbuffer[256];
if((s=socket(AF_INET,SOCK_STREAM,0))<0){
perror(“socket”);
exit(1);
}
/*填寫sockaddr_in結構*/
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端傳來的信息*/
recv(s,buffer,sizeof(buffer),0);
printf(“%s\n”,buffer);
while(1){
bzero(buffer,sizeof(buffer));
/*從標準輸入設備取得字元串*/
read(STDIN_FILENO,buffer,sizeof(buffer));
/*將字元串傳給server端*/
if(send(s,buffer,sizeof(buffer),0)<0){
perror(“send”);
exit(1);
}
}
}
執行
$./connect
Welcometoserver!
hiIamclient!/*鍵盤輸入*/
/*<Ctrl+C>中斷程式*/