现在是网络社会,学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 3333 int 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 3333 int 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是要连接的服务器ip int 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#