在项目开发的过程中,需要和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);
}
}