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);
}
- C/S通信---服务器阻塞型使用
- C/S通信---服务器IO多路复用模型之select的使用
- C/S通信---服务器IO多路复用模型之poll的使用
- C/S通信---服务器IO多路复用模型之epoll的使用
- [linux C]使用select进行非阻塞socket通信
- C/S(客户端/服务器) TCP通信聊天程序
- Socket 客户端-服务器(C-S)通信实验
- 阻塞型通信程序
- java c/s通信
- C-S通信实验
- C/S通信
- 使用基本的ace类通信 c/s
- 使用javaNIO实现C/S模式的通信
- C++ACE实现通用的服务器C/S架构通信程序
- socket通信---并发服务器图解和阻塞通信图解
- socket通信---并发服务器图解和阻塞通信图解
- 非阻塞型TCP通信
- 非阻塞型通信进程
- [实践证明整理系列]CentOS 6中简单架设Apache James邮件服务器
- 第十周 项目1-二叉树算法库
- 黑马程序员———C语言 一维数组
- JNI原理与使用
- CATiledLayer讲解Part2
- C/S通信---服务器阻塞型使用
- 第九周--项目三--稀疏矩阵的三元组表示的实现及应用(2)
- Xcode7 关于http协议的修改,编译出错的解决方法
- iOS crash 崩溃问题的追踪方法
- Appium自动化测试系列1 - Appium环境的安装与配置
- 第十周--二叉树遍历的递归算法
- 项目4-广义表算法库及应用
- 第九周项目4——广义表算法库及应用(1)
- 如何用Tomcat和Openssl构建HTTPS双向认证环境(HTTPS客户端认证)