現在是網路社會,學linux不會tcp/ip,心裡老感覺空空的。所以也要認真好好學習這個東東了。
實驗目的:實現用戶端發送,伺服器接收
===========server===================
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define PORT 3333int main(int argc, char *argv[]){int sockfd;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int sin_size;char buf[100];sockfd = socket(AF_INET,SOCK_STREAM,0);//建立通訊端if(sockfd == -1){fprintf(stderr,"Socket error:%s\n",strerror(errno));exit(1);}bzero(&server_addr,sizeof(struct sockaddr_in));//置位元組字串s的前n個位元組為零且包括‘\0’server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//任何ip都可連上,我是開放滴server_addr.sin_port = htons(PORT);int on=1;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));//這個作用,你可以去掉再試試if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr_in))==-1)//綁定{fprintf(stderr,"Bind error:%s\n",strerror(errno));exit(1);}if(listen(sockfd,20)==-1)//監聽,還20個{ fprintf(stderr,"listen error:%s\n",strerror(errno)); exit(1);}int new_fd;pid_t child;int r_size;int w_size;while(1){printf("wait!!!!!\n");memset(buf,0,100);sin_size = sizeof(struct sockaddr_in);if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1) //接收,看是否有人連上{ fprintf(stderr,"Accept error:%s\n",strerror(errno)); exit(1);}fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr));if((r_size=read(new_fd,buf,100))==-1) //讀取資料 {fprintf(stderr,"Read error:%s\n",strerror(errno)); exit(1); } printf("Received information%d::%s\n",r_size,buf); }close(sockfd);exit(0);}
===========client====================
#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define PORT 3333int main(int argc, char *argv[]){int sockfd;char buf[100];struct sockaddr_in server_addr;struct hostent *host;sockfd = socket(AF_INET,SOCK_STREAM,0);//建立通訊端if(sockfd==-1){fprintf(stderr,"Socket error:%s\n",strerror(errno));exit(1);}bzero(&server_addr,sizeof(server_addr));//置位元組字串s的前n個位元組為零且包括‘\0’server_addr.sin_family=AF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=inet_addr("192.168.1.155");//ip是要已連線的服務器ipint con_flag;con_flag=connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr));//串連if(con_flag==-1){fprintf(stderr,"Connect Error:%s\a\n",strerror(errno)); exit(1); }printf("Please input some words:");fgets(buf,100,stdin);if(write(sockfd,buf,sizeof(buf))<0)//往得到的通訊端介面裡寫資料{fprintf(stderr,"write Error:%s\a\n",strerror(errno)); exit(1);}close(sockfd);//請關閉 exit(0);}
實驗結果如下:
root@wyz-vlinux:~/test/sc# ./tcp_server
Server get connection from 192.168.1.155
Server received hello mama
Server get connection from 192.168.1.155
Server received i love linux
root@wyz-vlinux:~/test# ./tcp_client
Please input some words:hello mama
root@wyz-vlinux:~/test# ./tcp_client
Please input some words:i love linux
root@wyz-vlinux:~/test#