该部分分为客户端和服务器端两部分,其中服务器端首先建立起socket,然后与本地端口进行绑定,接着就开始接收从客户端的连接请求并建立与它的连接,接下来,接收客户端发送的消息。客户端则在建立socket之后调用socket之后调用connect()函数来建立连接。
server.c
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <unistd.h>
- #include <netinet/in.h>
- #define PORT 4321
- #define BUFFER_SIZE 1024
- #define MAX_QUE_CONN_NM 5
- int main()
- {
- struct sockaddr_in server_sockaddr,client_sockaddr;
- int sin_size,recvbytes;
- int sockfd,client_fd;
- char buf[BUFFER_SIZE];
- //建立socket连接
- if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
- {
- perror("socket");
- exit(1);
- }
- printf("Socket id = %d\n",sockfd);
- //设置sockaddr_in结构体中相关参数
- server_sockaddr.sin_family =AF_INET;
- server_sockaddr.sin_port=htons(PORT);
- server_sockaddr.sin_addr.s_addr=INADDR_ANY;
- bzero(&(server_sockaddr.sin_zero),8);
- int i=1;//允许重复使用本地址与套接字进行绑定
- setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
- //绑定函数bind
- if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))==-1)
- {
- perror("bind");
- exit(1);
- }
- printf("Bind success!\n");
- //调用Listen函数,创建为处理请求的队列
- if(listen(sockfd,MAX_QUE_CONN_NM)==-1)
- {
- perror("listen");
- exit(1);
- }
- printf("Listening....\n");
- //调用accept()函数,等待客户端的连接
- if((client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size))==-1)
- {
- perror("accept");
- exit(1);
- }
- memset(buf,0,sizeof(buf));
- //调用recv()函数,接收客户端的请求
- if((recvbytes = recv(client_fd,buf,BUFFER_SIZE,0))==-1)
- {
- perror("recv");
- exit(1);
- }
- printf("Received a message: %s\n",buf);
- close(sockfd);
- exit(0);
- }
client.c
- #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 4321
- #define BUFFER_SIZE 1024
- int main(int argc,char *argv[])
- {
- int sockfd,sendbytes;
- char buf[BUFFER_SIZE];
- struct hostent *host;
- struct sockaddr_in serv_addr;
- if(argc<3)
- {
- fprintf(stderr,"USAGE:./client Hostname(or ip address) Text\n");
- exit(1);
- }
- //地址解析函数
- if(host=gethostbyname(argv[1])==NULL)
- {
- perror("gethostname");
- exit(1);
- }
- memset(buf,0,sizeof(buf));
- sprintf(buf,"%s",argv[2]);
- //创建socket
- if((sockfd =socket(AF_INET,SOCK_STREAM,0))==-1)
- {
- perror("socket");
- exit(1);
- }
- //设置sockaddr_in结构体中相关参数
- serv_addr.sin_family=AF_INET;
- serv_addr.sin_port=htons(PORT);
- serv_addr.sin_addr=*((struct in_addr*)host->h_addr);
- bzero(&(serv_addr.sin_zero),8);
- //调用connect函数主动发出对服务端的连接
- if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr))==-1)
- {
- perror("Connect");
- exit(1);
- }
- //发送消息给服务端
- if((sendbytes = send(sockfd,buf,strlen(buf),0))==-1)
- {
- perror("Send");
- exit(1);
- }
- close(sockfd);
- exit(0);
- }
socket.rar
阅读(2568) | 评论(0) | 转发(1) |