IPv4套接口地址結(jié)構(gòu)
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
};
通用地址結(jié)構(gòu)
struct sockaddr {
uint8_t??sin_len;
sa_family_t??sin_family;
char?sa_data[14];//14
};
服務(wù)端
//查看8001端口
netstat -na | grep 8001?
int main(void){int sockfd=0;
/*socket 創(chuàng)建文件描述符*/
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 開(kāi)啟監(jiān)聽(tīng) 同時(shí)監(jiān)聽(tīng)數(shù)量
調(diào)用listen之后sockfd變成被動(dòng)套接字,只能接受鏈接不能主動(dòng)發(fā)送
*/
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數(shù)據(jù)包說(shuō)明對(duì)方已經(jīng)關(guān)閉
printf("對(duì)方已經(jīng)關(guān)閉\n");
exit(0);
}
else if(ret < 0){
perror("讀數(shù)據(jù)失敗\n");
exit(0);
}
fputs(revbuf,stdout);//服務(wù)器收到數(shù)據(jù),打印屏幕
write(conn,revbuf,ret);
}
return 0;
}
客戶端
int main(void){
int sockfd=0;
/*socket 創(chuàng)建文件描述符*/
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){
//向服務(wù)器上寫(xiě)數(shù)據(jù)
write(sockfd,sendbuf,sizeof(sendbuf));
//從服務(wù)器上讀數(shù)據(jù)
read(sockfd,revbuf,sizeof(revbuf));
//打印到屏幕
fputs(revbuf,stdout);
memset(revbuf,0,sizeof(revbuf));
memset(sendbuf,0,sizeof(sendbuf));
}
close(sockfd);
return 0;
}