複製鏈接
請複製以下鏈接發送給好友

connect

(Linux C函數)

鎖定
本函數用於創建與指定外部端口的連接。s參數指定一個未連接的數據報或流類套接口。如套接口未被捆綁,則系統賦給本地關聯一個唯一的值,且設置套接口為已捆綁。請注意若名字結構中的地址域為全零的話,則connect()將返回WSAEADDRNOTAVAIL錯誤。
對於流類套接口(SOCK_STREAM類型),利用名字來與一個遠程主機建立連接,一旦套接口調用成功返回,它就能收發數據了。對於數據報類套接口(SOCK_DGRAM類型),則設置成一個缺省的目的地址,並用它來進行後續的send()與recv()調用。
中文名
connect
相關函數
socket,bind,listen
表頭文件
#include
定義函數
int connect

connect相關函數

connect(建立socket連線)
socket,bind,listen
表頭文件
#include<sys/types.h>
#include<sys/socket.h>
定義函數
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen);

connect函數説明

connect()用來將參數sockfd 的socket 連至參數serv_addr 指定的網絡地址。結構sockaddr請參考bind()。參數addrlen為sockaddr的結構長度。

connect參數

參數一:套接字描述符
參數二:指向數據結構sockaddr的指針,其中包括目的端口和IP地址
參數三:參數二sockaddr的長度,可以通過sizeof(struct sockaddr)獲得

connect返回值

成功則返回0,失敗返回非0,錯誤碼GetLastError()。

connect錯誤代碼

EBADF 參數sockfd 非合法socket處理代碼
EFAULT 參數serv_addr指針指向無法存取的內存空間
ENOTSOCK 參數sockfd為一文件描述詞,非socket。
EISCONN 參數sockfd的socket已是連線狀態
ECONNREFUSED 連線要求被server端拒絕。
ETIMEDOUT 企圖連線的操作超過限定時間仍未有響應。
ENETUNREACH 無法傳送數據包至指定的主機。
EAFNOSUPPORT sockaddr結構的sa_family不正確。
EALREADY socket為不可阻斷且先前的連線操作還未完成。

connect範例

/* 利用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);
        }
    }
}
執行
$ ./connect
Welcome to server!
hi I am client! /*鍵盤輸入*/
/*<Ctrl+C>中斷程序*/