相關函式
connect(建立socket連線)
socket,bind,listen
表頭檔案
#include<sys/types.h>
#include<sys/socket.h>
定義函式
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen);
函式說明
connect()用來將參數sockfd 的socket 連至參數serv_addr 指定的網路地址。結構sockaddr請參考bind()。參數addrlen為sockaddr的結構長度。
參數
參數二:指向數據結構sockaddr的
指針,其中包括目的連線埠和IP位址
參數三:參數二sockaddr的長度,可以通過sizeof(struct sockaddr)獲得
返回值
成功則返回0,失敗返回非0,
錯誤碼GetLastError()。
錯誤代碼
EBADF 參數sockfd 非合法socket處理代碼
EFAULT 參數serv_addr指針指向無法存取的記憶體空間
ENOTSOCK 參數sockfd為一
檔案描述詞,非socket。
EISCONN 參數sockfd的socket已是連線狀態
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操作超過限定時間仍未有回響。
ENETUNREACH 無法傳送數據包至指定的主機。
EAFNOSUPPORT sockaddr結構的sa_family不正確。
EALREADY socket為不可阻斷且先前的連線操作還未完成。
範例
/* 利用socket的TCP client此程式會連線TCP server,並將鍵盤輸入的字元串傳送給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>#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結構*/ 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); } }}執行$ ./connectWelcome to server!hi I am client! /*鍵盤輸入*//*<Ctrl+C>中斷程式*/