socket API

IPv4套接口地址結構

struct sockaddr_in {

uint8_t??sin_len;4

sa_family_t??sin_family;4

in_port_tsin_port;2

struct?in_addrsin_addr;4

char?sin_zero[8];8

};

通用地址結構

struct sockaddr {

uint8_t??sin_len;

sa_family_t??sin_family;

char?sa_data[14];//14

};




服務端

//查看8001端口

netstat -na | grep 8001?


int main(void){

int sockfd=0;

/*socket 創建文件描述符*/

sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd == -1){

perror("fun socket\n");

exit(0);

}

/*bind 綁定地址和端口*/

/*struct sockaddr {

sa_family_t sa_family;

char? ? ? ? sa_data[14];

struct sockaddr_in {

uint8_t? sin_len; 4

sa_family_t? sin_family; 4

in_port_t sin_port; 2

struct in_addr sin_addr; 4

char sin_zero[8]; 8

};

}*/

struct sockaddr_in srvaddr;

srvaddr.sin_family = AF_INET;

srvaddr.sin_port = htons(8001);

srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if( bind(sockfd, (struct sockaddr *) &srvaddr,sizeof(srvaddr)) < 0){

perror("fun bind\n");

exit(0);

}

/*listen 開啟監聽 同時監聽數量

調用listen之后sockfd變成被動套接字,只能接受鏈接不能主動發送

*/

if(listen(sockfd,SOMAXCONN) < 0){

perror("fun listen\n");

exit(0);

}

/*accept */

struct sockaddr_in peeraddr;

socklen_t peerlen=sizeof(peeraddr);

unsigned int conn = 0;

conn = accept(sockfd,(struct sockaddr *) &peeraddr,(socklen_t *) &peerlen);

if(conn == -1){

perror("fun accept\n");

exit(0);

}

printf("perradd:%s\n perrport:%d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));

char revbuf[1024] = {0};

/*read write*/

while(1){

int ret = read(conn,revbuf,sizeof(revbuf));

if(ret == 0){

//收到0數據包說明對方已經關閉

printf("對方已經關閉\n");

exit(0);

}

else if(ret < 0){

perror("讀數據失敗\n");

exit(0);

}

fputs(revbuf,stdout);//服務器收到數據,打印屏幕

write(conn,revbuf,ret);

}

return 0;

}


客戶端

int main(void){

int sockfd=0;

/*socket 創建文件描述符*/

sockfd=socket(AF_INET,SOCK_STREAM,0);

if(sockfd == -1){

perror("fun socket\n");

exit(0);

}

/*bind 綁定地址和端口*/

/*struct sockaddr {

sa_family_t sa_family;

char? ? ? ? sa_data[14];

struct sockaddr_in {

uint8_t? sin_len; 4

sa_family_t? sin_family; 4

in_port_t sin_port; 2

struct in_addr sin_addr; 4

char sin_zero[8]; 8

};

}*/

struct sockaddr_in srvaddr;

srvaddr.sin_family = AF_INET;

srvaddr.sin_port = htons(8001);

srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(srvaddr)) < 0){

perror("connect error\n");

exit(0);

}

char revbuf[1024] = {0};

char sendbuf[1024] = {0};

while(fgets(sendbuf,sizeof(sendbuf),stdin) != NULL){

//向服務器上寫數據

write(sockfd,sendbuf,sizeof(sendbuf));

//從服務器上讀數據

read(sockfd,revbuf,sizeof(revbuf));

//打印到屏幕

fputs(revbuf,stdout);

memset(revbuf,0,sizeof(revbuf));

memset(sendbuf,0,sizeof(sendbuf));

}

close(sockfd);

return 0;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容