现在的位置: 首页 > 综合 > 正文

socket

2013年03月19日 ⁄ 综合 ⁄ 共 3577字 ⁄ 字号 评论关闭

simple server and client 

may be useful for copy in the future

server:

#include <errno.h>
#include "sys/types.h"
#include "sys/socket.h"
#include "sys/stat.h"
#include "unistd.h"
#include <netinet/in.h>
//#include <arpa/inet.h>
#include <fcntl.h>

#define SERVER_PORT (56738)
#define SERVER_IP "127.0.0.1"
#define LOG printf

static void handle_crashing_process_new(int fd)
{
    int n;
    unsigned int tid;
    int length = getpid();
    int retry = 30;
    printf("handle_crashing_process_new in\n");
    while((n = read(fd, &tid, sizeof(unsigned))) != sizeof(unsigned)) {
        if(errno == EINTR) continue;
        if(errno == EWOULDBLOCK) {
            if(retry-- > 0) {
                usleep(100 * 1000);
                continue;
            }
            LOG("timed out reading tid\n");
            goto done;
        }
        //LOG("read failure %s\n", strerror(errno));
        //goto done;
    }
    printf("getpid =%d\n",tid);
    n = send(fd, &length,sizeof(length),0);
    if(n < 0){ 
        printf("send failure %s\n", strerror(errno));
        goto done;
    }
    done:
        return;
}
int main(int argc, char** argv)
{
    int s;
    struct sockaddr_in addr;  
    //bzero(&addr,sizeof(addr));

    addr.sin_family = AF_INET;
    addr.sin_port = htons(SERVER_PORT);
    addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    
    s = socket(AF_INET,
            SOCK_STREAM, 0);
    if(s < 0){ 
        printf("socket failure %s\n", strerror(errno));
        goto done;
    }
    //fcntl(s, F_SETFD, FD_CLOEXEC);

    //LOG("debuggerd: " __DATE__ " " __TIME__ "\n");
    //printf("pid=%d,tid=%d\n",getpid(),gettid());
    
    if(bind(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) < 0) 
    {  
        printf("bind error %s\n",strerror(errno));
        goto done;    
    }
    
    if (listen(s,10))
    {
        printf("listen error %s\n",strerror(errno));
        goto done;    
    }
    
    for(;;) {
        struct sockaddr addr;
        socklen_t alen;
        int fd;

        alen = sizeof(addr);
        printf("before accept\n");
        fd = accept(s, &addr, &alen);
        printf("after accept\n");
        if(fd < 0) {
            printf("accept failed: %s\n", strerror(errno));
            continue;
        }
        //fcntl(fd, F_SETFD, FD_CLOEXEC);
        handle_crashing_process_new(fd);
        close(fd);
        fd = -1;
    }
    done:
    close(s);
    
    return 0;
}


client

#include <stdio.h>
#include <errno.h>
#include "sys/types.h"
#include "sys/socket.h"
#include "sys/stat.h"
#include "unistd.h"
//#include <sys/syscall.h>  
#include <netinet/in.h>
//#include <arpa/inet.h>
#include <fcntl.h>

  
#define gettid() ((pid_t) syscall(SYS_gettid)) 
#define SERVER_PORT 56738
#define SERVER_IP "127.0.0.1"
#define LOG printf

 void sendPidtoServer()
{
    int s;
    int pid, tid;
    int datalen=0,retry=30;
    printf("333 pid\n");
    pid=getpid();
    tid=pid;//gettid();
    int n = 0;
    printf("pid=%d\n",pid);
    struct sockaddr_in addr;  
    //bzero(&addr,sizeof(addr));

    addr.sin_family = AF_INET;
    addr.sin_port = htons(SERVER_PORT);
    addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s<0)
    {
        printf(" socket error %s", strerror(errno));
        goto done;
    }
    n= connect(s,(struct sockaddr*)(&addr),sizeof(addr));
    if (n!=0)
    {
        printf(" connect error %s", strerror(errno));
        goto done;
    }
    n = send(s,&tid,sizeof(tid),0);
    if (n<0)
    {
        printf(" connect error %s\n", strerror(errno));
        goto done;
    }
    while((n = read(s, &datalen, sizeof(datalen))) != sizeof(datalen)) {
        if(errno == EINTR) continue;
        if(errno == EWOULDBLOCK) {
            if(retry-- > 0) {
                usleep(100 * 1000);
                continue;
            }
            LOG("timed out reading tid\n");
            goto done;
        }
    }    
    printf("get length=%d\n",datalen);
    sleep(1);
    done:
    close(s);
}

int main(int argc, char** argv)
{
    printf("socket client\n");
    sendPidtoServer();
    return 0;
}


抱歉!评论已关闭.