TCP接受和发送程序以及长连接的处理方法

来源:互联网 发布:fm2016开档曼联数据 编辑:程序博客网 时间:2024/06/04 01:38

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


0 0
原创粉丝点击