C/S通信---服务器阻塞型使用

来源:互联网 发布:java把汉字转换成拼音 编辑:程序博客网 时间:2024/06/16 11:50

服务器端代码:

#include<stdio.h>

#include<sys/socket.h>
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<stdlib.h>

int main()
{
int socket_fd,connect_fd;
struct sockaddr_in servaddr;
char buff[3];
int n;

//create socket
if((socket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("create socket error!\n");
exit(0);
}

//set local address
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8000);

//bind the local addr to socket
if(bind(socket_fd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
{
printf("bind error!\n");
exit(0);
}

//listen client
if(listen(socket_fd,10) == -1)   //客户端连接数量不能超过11
{
printf("listen error\n");
exit(0);
}
printf("wait for client connection!\n");
//wait for client
while(1)
{
if((connect_fd = accept(socket_fd,(struct sockaddr*)NULL,NULL)) == -1)
{
printf("accept socket error: %s\n",strerror(errno));
continue;
}

//receive
int ret = 1;
printf("receive from client: \n");
while(ret)
{
n = recv(connect_fd, buff, sizeof(buff),0);
if(n < 0)
{
if(errno == EAGAIN) // there is no data in buff
break;
else //socket is close
exit(0);
}
else if(n == 0) //clinet socket is close normal
{
close(connect_fd);
break;
}
if(n != sizeof(buff)) //no data
ret = 0;
else //more data ,more time
ret = 1;
buff[n] = '\0';    //为什么赋值能成功?已经越界。 还有最后一次buff长度为什么是实际长度+1
printf("%s",buff);
}
printf("\n");
if(!fork()) //send data to client
{
if(send(connect_fd,"hello, you are connected\n",26,0) == -1)
perror("send error");
close(connect_fd);
exit(0);
}
close(connect_fd); //close connect socket
}
close(socket_fd);
}


客户端代码:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<netinet/in.h>
#include<errno.h>
#include<unistd.h>
#include<arpa/inet.h>

int main(int argc,char **argv)
{
int socket_fd;
int rec_len;
char recvmsg[4096];
char sendmsg[4096];
struct sockaddr_in servaddr;

if(argc != 2)
{
printf("usage: ./client <ip>\n");
exit(0);
}

//create socket
if((socket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
printf("create socket error\n");
exit(0);
}

memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8000);
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) ==-1)
{
printf("inet_pton error for %s\n",argv[1]);
exit(0);
}

//connect socket
if(connect(socket_fd,(struct sockaddr *)&servaddr,sizeof(servaddr)) == -1)
{
printf("connect error:%s\n",strerror(errno));
exit(0);
}
printf("send msg to server:\n");
fgets(sendmsg,4096,stdin);

if(send(socket_fd,sendmsg,strlen(sendmsg),0) == -1)
{
printf("send msg error :%s\n",strerror(errno));
exit(0);
}
if((rec_len = recv(socket_fd,recvmsg,4096,0)) == -1)
{
perror("recv error");
exit(0);
}
recvmsg[rec_len] = '\0';
printf("received :%s",recvmsg);
close(socket_fd);
exit(0);
}


0 0
原创粉丝点击