linux网络编程之socket(TCP)

来源:互联网 发布:openstack windows 编辑:程序博客网 时间:2024/06/06 02:30

对于网络编程,有一种说法就是一切皆socket。

之前只是大概了解socket网络编程的流程,最近学习了一下如何进行socket网络编程,实现TCP通信。

下面是服务器端的例子:

/*socket网络编程学习服务器端:一直监听本机的8000端口,如果收到连接请求,将接收请求并接受客户端发来的信息,并向客户端返回消息。这个程序实现的是TCP并发服务器。并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个子进程来处理。2016-4-5*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define MAXLINE 4096#define DEFAULT_PORT 8000int main(){int socket_fd,connect_fd;struct sockaddr_in  servaddr;//用于记录网络地址char buff[4096];int n;//初始化memset(&servaddr ,0 ,sizeof(servaddr));//结构体置零servaddr.sin_family=AF_INET;//AF_INET表示IP协议族servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//IP地址设置为INADDR_ANY,让系统自动获取本机的IP地址。servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT//初始化socketif((socket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){printf("create socket error : %s(error: %d)\n",strerror(errno),errno);exit(0);}//将本地地址和端口号绑定到所创建的套接字上if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)//可以将sockaddr换为sockaddr_in,编译会有警告{printf("bind socket error:%s(error:%d)\n",strerror(errno),errno);exit(0);}//开始监听是否有客户端连接,,,,并设置允许的最大连接数if(listen(socket_fd,10)==-1){printf("listen socket error:%s(errno:%d)\n",strerror(errno),errno);exit(0);}printf("=====waiting for client's request ======\n");while(1){//阻塞直到有客户端连接,不然多浪费CPU资源。if((connect_fd=accept(socket_fd,(struct sockaddr*)NULL,NULL)) == -1)//accept函数用来等待来自客户端的socket的连接请求{printf("accept socket error :%s(errno:%d)\n",strerror(errno),errno);continue;}//接收客户端传过来的数据n=recv(connect_fd,buff,MAXLINE,0);//向客户端发送回应数据if(!fork()){if(send(connect_fd,"\tHello,your message has been received!\n",40,0)==-1)perror("send error");close(connect_fd);exit(0);//关掉发送进程}buff[n]='\0';printf("recv msg from client:\n\t%s",buff);close(connect_fd);}close(socket_fd);}
接着是客户端的代码:

/*socket网络编程学习基于TCP网络程序设计客户端:向相应的IP地址主机的8000端口发送数据,并接收回执。2016-4-5*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#define DEFAULT_PORT 8000#define MAXLINE 4096int main(int argc,char **argv){int sockfd,n,rec_len;char recvline[4096],sendline[4096];char buf[MAXLINE];struct sockaddr_in servaddr;if(argc != 2){printf("please input: ./client <ipaddress>\n");exit(0);}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(DEFAULT_PORT);if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//inet_pton是Linux下IP地址转换函数,可以将IP地址在“点分十进制”和整数之间转换。{printf("IP error:%s(errno:%d)\n",strerror(errno),errno);exit(0);}if((sockfd =socket(AF_INET,SOCK_STREAM,0))<0)//创建一个socket{printf("create socket error :%s(errno:%d)\n",strerror(errno),errno);exit(0);}if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)//连接服务器{printf("connect error :%s(errno:%d)\n",strerror(errno),errno);exit(0);}printf("send msg to server:\n");fgets(sendline,4096,stdin);if( send(sockfd,sendline,strlen(sendline),0)<0)//发送数据{printf("send msg error :%s(errno:%d)\n",strerror(errno),errno);exit(0);}if((rec_len=recv(sockfd,buf,MAXLINE,0))==-1)//接收回执{perror("recv error");exit(1);}buf[rec_len]='\0';printf("send success:%s",buf);//打印回执close(sockfd);exit(0);}

将两个程序进行编译运行。


接着运行着两个程序:

客户端发送CSDN给服务器,并接收来自服务器的回执。


服务器端收到来自客户端发送的数据。



内容多参考:http://blog.csdn.net/hguisu/article/details/7445768/

1 0