TCP接受和发送程序以及长连接的处理方法
2016-01-07 10:18
549 查看
在项目开发的过程中,需要和Socket建立一个长连接,项目组开发一部分代码写下来今后便于查找调用。
创建子进程的时候,把所有父进程的代码区拷贝到子进程。子进程继承了所有父进程的代码区。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdbool.h>
int main(int argc, char * argv[])
{
int listen_sock, comm_sock;
struct sockaddr_in listen_addr;
struct sockaddr_in client_addr;
int sin_size;
char msg[1024];
int msgLen; // should declarirated in respective process...
char ack[1024];
int ackLen; // same as the above...
//create socket
if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) //AF_INET:IPV4,SOCK_STREAM:TCP
{
fprintf(stderr,"Socket error : %s\n\a",strerror(errno));
exit(1);
}
//fill in struct sockaddr on server
bzero(&listen_addr, sizeof(struct sockaddr_in));
listen_addr.sin_family = AF_INET;
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY); //(most important)Can use any address of localhost to communicate
listen_addr.sin_port = htons(PORTNUM);
//bind sockfd to IP
if (bind(listen_sock, (struct sockaddr *)(&listen_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr,"Bind error : %s\n\a",strerror(errno));
exit(1);
}
if (listen(listen_sock, 5) == -1)
{
fprintf(stderr,"Listen error : %s\n\a",strerror(errno));
exit(1);
}
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if ((comm_sock = accept(listen_sock, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
{
fprintf(stderr,"Accept error : %s\n\a",strerror(errno));
continue;
}
if (fork() == 0)
{
fprintf(stderr,"Server get connection form %s\n\a",(char *)(inet_ntoa(client_addr.sin_addr)));
bzero(msg, 1024);
msgLen = read(comm_sock, msg, 1024);
while ((msgLen != -1) && (msgLen != 0))
{
write(comm_sock, ack, ackLen); //ack send to client
bzero(msg, 1024);
msgLen = read(comm_sock, msg, 1024); // msg send to server
}
close(listen_sock); // close children the listen_sock
close(comm_sock);
if (-1 == msgLen)
{
fprintf(stderr,"Read Error : %s\n\a",strerror(errno));
exit(1);
}
else
{
fprintf(stderr,"%s\n", "Connection been closed");
exit(0);
}
}
else
close(comm_sock);
}
}
创建子进程的时候,把所有父进程的代码区拷贝到子进程。子进程继承了所有父进程的代码区。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdbool.h>
int main(int argc, char * argv[])
{
int listen_sock, comm_sock;
struct sockaddr_in listen_addr;
struct sockaddr_in client_addr;
int sin_size;
char msg[1024];
int msgLen; // should declarirated in respective process...
char ack[1024];
int ackLen; // same as the above...
//create socket
if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) //AF_INET:IPV4,SOCK_STREAM:TCP
{
fprintf(stderr,"Socket error : %s\n\a",strerror(errno));
exit(1);
}
//fill in struct sockaddr on server
bzero(&listen_addr, sizeof(struct sockaddr_in));
listen_addr.sin_family = AF_INET;
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY); //(most important)Can use any address of localhost to communicate
listen_addr.sin_port = htons(PORTNUM);
//bind sockfd to IP
if (bind(listen_sock, (struct sockaddr *)(&listen_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr,"Bind error : %s\n\a",strerror(errno));
exit(1);
}
if (listen(listen_sock, 5) == -1)
{
fprintf(stderr,"Listen error : %s\n\a",strerror(errno));
exit(1);
}
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if ((comm_sock = accept(listen_sock, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
{
fprintf(stderr,"Accept error : %s\n\a",strerror(errno));
continue;
}
if (fork() == 0)
{
fprintf(stderr,"Server get connection form %s\n\a",(char *)(inet_ntoa(client_addr.sin_addr)));
bzero(msg, 1024);
msgLen = read(comm_sock, msg, 1024);
while ((msgLen != -1) && (msgLen != 0))
{
write(comm_sock, ack, ackLen); //ack send to client
bzero(msg, 1024);
msgLen = read(comm_sock, msg, 1024); // msg send to server
}
close(listen_sock); // close children the listen_sock
close(comm_sock);
if (-1 == msgLen)
{
fprintf(stderr,"Read Error : %s\n\a",strerror(errno));
exit(1);
}
else
{
fprintf(stderr,"%s\n", "Connection been closed");
exit(0);
}
}
else
close(comm_sock);
}
}
相关文章推荐
- 详解HttpURLConnection
- URL,URLConnection,HttPURLConnection的使用
- Android 封装http请求的工具类
- APP 检测网络的状态 是wifi 还是蜂窝连接
- 深入了解HTTP和Socket在实时性Web上的实践
- libevent的http服务与libjson结合
- Http 协议
- Android:3G网络是否可用
- 2016【太原网络营销师】郭文军教你如何学网络营销
- 消除SDK更新时的“https://dl-ssl.google.com refused”异常
- Mac用CornerStone配置SVN,HTTP及svn简单使用说明
- asp.net中http提交数据所遇到的那些坑
- [原]unity3d之http多线程异步资源下载
- SDH,OTN,IP,MPLS,ATM网络介绍
- Android之使用Http协议实现文件上传示例(上传MP3文件)
- 关于广域网环境TCP是否适用的问题
- 关于Java去连接HTTP地址的操作
- HTTP状态码
- Tomcat 输入http://localhost:8080网页打不开(估计是端口号被占用)
- 关于Spring4.0 MappingJackson2HttpMessageConverter