您的位置:首页 > 理论基础 > 计算机网络

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: