user-0 提问: c socket遇到的问题，求助···最后的100分全给了

回复:
user: user-1
content: accept的问题楼上几位大拿都说了~ 服务端缓存你可以使用文件形式存储在本地，也可以使用第三方sqlite轻量级数据库存储，或者使用access数据库存储，方式很多~ 如果嫌麻烦，可以直接搞个全局变量存在内存中~

user: user-2
content: 参考代码：  typedef struct sinfo { 	char type[32]; 	int num; }info;   iDataNum = recv(client, buff, sizeof(info), 0);   强烈建议处理send/recv的返回值，可以判断真正发送/接收的数据大小。

user: user-2
content: 找到最关键的问题了： 1、发送和接收缓冲区，这个type是不对的，它只是一个指针，sizeof得不到它所指向的内存的大小，发送时也不会取到，所以建议改成数组； 2、accept之后，得到了一个client，这才是recv要用到的描述符。

user: user-3
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-4
content: 《MFC基于select模型的套接字类之服务器（1）》 http://blog.csdn.net/hou09tian/article/details/78462624 《MFC基于select模型的套接字类之服务器（2）》 http://blog.csdn.net/hou09tian/article/details/78462761 另外还有3-8，可以在博客中搜索 希望能够帮到你

user: user-4
content: accept()函数后面多了个分号，不管accept()函数的返回值是否小于0，都会执行后面的  printf("accept error"); return 1;  也就是说，此时程序已经结束了

user: user-4
content: 确实，正如楼上朋友所说，accept()函数后面多了个分号。 你的程序里面没有WSAStartup()初始化套接字的函数，后面的套接字函数能调用成功么？

user: user-0
content: 服务器接受到客户端的add del show 操作，服务器将接受的结构体数据存入一个链表，取链表中的int数据返回给客户端，怎么传递好，我直接捌int数组转成char传过去，客户端在转成int数组，但是取数据有其他数据。应该怎么取处理才好。   #include <sys/stat.h>   #include <fcntl.h>   #include <errno.h>   #include <netdb.h>   #include <sys/types.h>   #include <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>      #include <stdio.h>   #include <string.h>   #include <stdlib.h>   #include <unistd.h>      #define SERVER_PORT 9300  #define TMAX 10      int main(int atgc, char *argv[])   {       int server;     struct sockaddr_in server_addr;  	//服务器      struct sockaddr_in client_addr;  	//客户端      typedef struct sinfo     { 	char type[TMAX]; 	int num;     }info;      typedef struct nums     { 	int num; 	struct nums *next;     }data;      socklen_t clen = sizeof(client_addr);     int client;     int i;     int a[100];     char *ch;     char buff[1024];     int DataLen;          data *d;     d = (data *)malloc(sizeof(data));     d->next == NULL;        if((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)       {     	printf("socket init error");         return 1;       }          bzero(&server_addr, sizeof(server_addr));       //memset(&server_addr, 0, sizeof(server_addr));     server_addr.sin_family = AF_INET;       server_addr.sin_port = htons(SERVER_PORT);       server_addr.sin_addr.s_addr = htonl(INADDR_ANY);            if((bind(server, (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)       {   	printf("bind error");         return 1;       }       //设置服务器上的socket为监听状态       if(listen(server, 5) < 0)        {   	printf("page out 5");         return 1;       }     while(1)     {           printf("listening port: %d\n", SERVER_PORT);           if ((client = accept(server, (struct sockaddr *)&client_addr, &clen)) < 0) 	{ 	    printf("accept error"); 	    //return 1; 	}         printf("recv client info:\n");           printf("=====================\n");           printf("IP is %s\n", inet_ntoa(client_addr.sin_addr));           printf("Port is %d\n", htons(client_addr.sin_port));           printf("=====================\n");    	memset(buff, 0, 1024); 	info f; 	recv(client, buff, sizeof(info), 0); 	//read(client, (void *)buff, sizeof(info)); 	memcpy(&f, buff, sizeof(info)); 	//printf("%p======\n",&buffer);  	//printf("%s======\n",buffer);  	printf("%s======\n",f.type);  	printf("%d======\n",f.num); 	if (strcmp(f.type, "add") == 0) 	{ 	    printf("dsdsdsdsdsd\n"); 	    data *n; 	    n = (data *)malloc(sizeof(data)); 	    n->num = f.num; 	    n->next = d->next; 	    d->next = n; 	} 		 	if (strcmp(f.type, "del") == 0) 	{ 	    data *p,*q; 	    p = d->next; 	    while (p->num != f.num) 	    { 		q = p; 		p = p->next; 		 	    if (p->num == f.num) 	    { 	    	q->next = p->next; 		free(p); 		printf("is del\n"); 		break; 	    } 	    printf("is not found"); 		break; 	    } 	}  	if (strcmp(f.type, "show") == 0) 	{ 	    data *s; 	    s = d->next; 	    i = 0; 	    while (s != NULL) 	    { 		 		printf("is ssssssss\n"); 		//sprintf(buff ,"%d", s->num);	 		//memcpy(buff + i*sizeof(int), &(s->num), sizeof(int)); 		a[i] = s->num; 		printf("%d\n",s->num); 		s = s->next; 		i++; 	    } 	    //printf("buff:%s\n", buff); 	    //memcpy(buff, s, sizeof(buff)); 	    ch = (char *)&a[0]; 	    if (send(client, ch, sizeof(a), 0) < 0) 	    { 		printf("send error"); 	    } 	 	} 	 		//if (strcmp(f.type, "sort") == 0)  	if (strcmp(f.type, "clear") == 0) 	{ 	    data *k, *l; 	    k = d->next; 	    while (k != NULL)     	    { 	        printf("clclcllclclclcl"); 		l = k; 		k = k->next; 		free(l); 		l = NULL; 	    } 	}    }       return 0;   }   =====================================  /*socket tcp客户端*/   #include <sys/stat.h>   #include <fcntl.h>   #include <errno.h>   #include <netdb.h>   #include <sys/types.h>   #include <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>      #include <stdio.h>   #include <string.h>   #include <stdlib.h>   #include <unistd.h>      #define SERVER_PORT 9300  #define TMAX 10    int main(int argc, char* argv[])   {       int client;       struct sockaddr_in serverAddr;     typedef struct sinfo     { 	char type[TMAX]; 	int num;     }info;     int i;     int a[100];     char *ch;     char sendbuf[1024];       char recvbuf[1024];       int DataLen;       if((client = socket(AF_INET, SOCK_STREAM, 0)) < 0)       {           perror("socket");           return 1;       }          serverAddr.sin_family = AF_INET;       serverAddr.sin_port = htons(SERVER_PORT);       serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");            if(connect(client, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)       {           return 1;       }          memset(sendbuf, 0, 1024);      memset(recvbuf, 0, 1024);      info f;      if (argc == 3)     { 	strcpy(f.type, argv[1]); 	f.num = atoi(argv[2]);     }      if (argc == 2)     { 	strcpy(f.type, argv[1]); 	f.num = 0;	     }	 	     printf("type: %s\n", f.type);     printf("num: %d\n", f.num);     memcpy(sendbuf, &f, sizeof(info));         if ((DataLen = send(client, sendbuf, sizeof(info), 0)) < 0) 	printf("is not send\n");  	printf("slen:%d\n", DataLen); 	     ch = (char *)&a[0];     if ((DataLen = recv(client, ch, sizeof(a), 0)) < 0) 	printf("recv error");     for(i=0; i<sizeof(a)/4; i++)     { 	printf("data:%d\n", ch[i]);      } }

user: user-2
content: 你在调用accept函数的这个if语句后面多了个分号

user: user-5
content: 服务器代码：  #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define sockfd_PORT 9300  typedef struct sinfo {     char type[128];     int num; }info;  int main(int atgc, char *argv[]) {     int sockfd;     struct sockaddr_in server_addr;      //服务器     struct sockaddr_in client_addr;      //客户端     socklen_t clen = sizeof(client_addr);     int client, ret;      if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)     {         printf("socket init error");         return 1;     }      //bzero(&server_addr, sizeof(server_addr));     memset(&server_addr, 0, sizeof(server_addr));     server_addr.sin_family = AF_INET;     server_addr.sin_port = htons(sockfd_PORT);     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);      if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)     {         printf("bind error");         return 1;     }     //设置服务器上的socket为监听状态     if(listen(sockfd, 5) < 0)     {         printf("page out 5");         return 1;     }     while(1)     {         printf("listening port: %d\n", sockfd_PORT);         if ((client = accept(sockfd, (struct sockaddr *)&client_addr, &clen)) < 0)         {             printf("accept error");             return 1;         }         printf("recv client info:\n");         printf("IP is %s\n", inet_ntoa(client_addr.sin_addr));         printf("Port is %d\n", htons(client_addr.sin_port));          info *f;         f = (info *)malloc(sizeof(info));         if (!f) {             fprintf(stderr, "malloc error!\n");             return 1;         }         ret = recv(client, (char *)f, sizeof(info), 0);         if (ret <= 0) {             printf("Client close !\n");             close(client);         } else {             printf("ret = %d\n", ret);             printf("%s======\n", f->type);             printf("%d======\n", f->num);         }         free(f);     }     return 0; }  客户端代码： #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define SERVER_PORT 9300 typedef struct sinfo {     char type[128];     int num; }info;  int main(int argc, char* argv[]) {     int client;     struct sockaddr_in serverAddr;     if((client = socket(AF_INET, SOCK_STREAM, 0)) < 0)     {         perror("socket");         return 1;     }      serverAddr.sin_family = AF_INET;     serverAddr.sin_port = htons(SERVER_PORT);     serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");      if(connect(client, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)     {         return 1;     }      if (argc == 3 && strcmp(argv[1], "add") == 0)     {         printf("111111111111111111111\n");         info *f;         f = (info *)malloc(sizeof(info));         if (!f) {             fprintf(stderr, "malloc error!\n");             return 1;         }         f->num = atoi(argv[2]);         memcpy(f->type, argv[1], strlen(argv[1]) + 1);          printf("num: %d\n", f->num);         printf("type: %s\n", f->type);         if (send(client, (char *)f, sizeof(info), 0) < 0)             printf("is not send\n");          free(f);     }      if (argc == 3 && strcmp(argv[1],"close") == 0)     {         close(client);     }     return 0; }   参考一下吧； 注意server服务器recv的应该是client

user: user-2
content: 如果要重启服务端后保持原来的数据，缓存可以在文件、数据库等等，你需要在启动时读入并做处理，而且，非常重要的一点，等数据都恢复完了之后再启动监听，否则冲突处理会比较麻烦。