for code copy in the future
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;
- }