注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

问个socket的问题。  

2010-03-05 13:43:12|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

来源:http://cpp-circle.group.javaeye.com/group/topic/1823

在写socket程序的时候,现在出现了一个问题。具体的是什么原因,没有找到。google上和论坛里都没有找到。请大人们帮忙解决。问题是这样的:一个Server端。一个Client端。Server接收数据时候,因为client端的socket关闭了。(是我手动关闭的,用来模拟数据传输失败的场景),结果Server端的程序都死掉了。实在是找不出原因。本人采用的操作系统:Server端是红帽企业版3.0,client是windows。编程语言:Server端是c++,client是java。现在把代码贴出来。如下。

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-12

socket的封装的头文件:

Java代码 问个socket的问题。 - phperwuhan - phperwuhan的博客

  1. #ifndef __BASE_SOCKET__   
  2. #define __BASE_SOCKET__   
  3.   
  4. #define _LINUX__   
  5.   
  6. #ifdef _WIN32__   
  7.     #pragma comment(lib, "ws2_32.lib")   
  8. #endif    
  9.        
  10. #ifdef _LINUX__   
  11.     #include <unistd.h>   
  12.     #include <netinet/in.h>   
  13.     #include <sys/socket.h>   
  14.     #include <sys/types.h>   
  15.     #include <arpa/inet.h>   
  16.     #ifndef SOCKET   
  17.         #define SOCKET int  
  18.     #endif   
  19. #endif   
  20.        
  21. #define _TCP 0  
  22. #define _UDP 1  
  23.   
  24. #define SOCKET_EXCEPTION -1  
  25.   
  26. class BaseSocket   
  27. {   
  28. protected:   
  29.     struct sockaddr_in addr;       
  30.     SOCKET sock;   
  31.   
  32. public:   
  33.     BaseSocket();   
  34.     BaseSocket(SOCKET sock);   
  35.     BaseSocket(const BaseSocket& bsocket);   
  36.     ~BaseSocket();   
  37.   
  38.     bool operator == (const BaseSocket& s)   
  39.     {   
  40.         return sock == s.sock;   
  41.     };   
  42.   
  43.     unsigned short getPort() const;   
  44.     char* getIP() const;   
  45.   
  46.     static bool init();   
  47.     static bool destroy();   
  48.   
  49.     bool create(int type = _TCP);   
  50.     bool isValid();   
  51.     bool close();   
  52.   
  53.     bool bind(unsigned short port);   
  54.     bool listen(int num = 5);   
  55.     BaseSocket accept();   
  56.     bool connect(const char* ip, unsigned short port);   
  57.   
  58.     bool recvChar(char* v);   
  59.     bool recvShort(short* v);   
  60.     bool recvInt(int* v);   
  61.     bool recvLong(long* v);   
  62.     bool recvI64(I64* v);   
  63.     bool recvStr(char* str, int len);   
  64.   
  65.     bool send(char data);   
  66.     bool send(short data);   
  67.     bool send(int data);   
  68.     bool send(long data);   
  69.     bool send(I64 data);   
  70.     bool send(U_I64 data);   
  71.     bool send(char* str, int len);   
  72.     bool setTimeOut(int millSec);   
  73.   
  74. protected:   
  75.     bool createTCP();   
  76.     bool createUDP();   
  77.     bool realCreate(int af = AF_INET, int type = SOCK_STREAM, int protocol = IPPROTO_TCP);   
  78. };   
  79.   
  80. #endif //~__BASE_SOCKET__  

#ifndef __BASE_SOCKET__#define __BASE_SOCKET__#define _LINUX__#ifdef _WIN32__ #pragma comment(lib, "ws2_32.lib")#endif #ifdef _LINUX__ #include <unistd.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #ifndef SOCKET #define SOCKET int #endif#endif #define _TCP 0#define _UDP 1#define SOCKET_EXCEPTION -1class BaseSocket{protected: struct sockaddr_in addr; SOCKET sock;public: BaseSocket(); BaseSocket(SOCKET sock); BaseSocket(const BaseSocket& bsocket); ~BaseSocket(); bool operator == (const BaseSocket& s) { return sock == s.sock; }; unsigned short getPort() const; char* getIP() const; static bool init(); static bool destroy(); bool create(int type = _TCP); bool isValid(); bool close(); bool bind(unsigned short port); bool listen(int num = 5); BaseSocket accept(); bool connect(const char* ip, unsigned short port); bool recvChar(char* v); bool recvShort(short* v); bool recvInt(int* v); bool recvLong(long* v); bool recvI64(I64* v); bool recvStr(char* str, int len); bool send(char data); bool send(short data); bool send(int data); bool send(long data); bool send(I64 data); bool send(U_I64 data); bool send(char* str, int len); bool setTimeOut(int millSec);protected: bool createTCP(); bool createUDP(); bool realCreate(int af = AF_INET, int type = SOCK_STREAM, int protocol = IPPROTO_TCP);};#endif //~__BASE_SOCKET__

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-12

socket封装的实现文件

Java代码 问个socket的问题。 - phperwuhan - phperwuhan的博客

  1. #include "BaseSocket.h"  
  2. #include <cstdio>   
  3.   
  4. BaseSocket::BaseSocket(): sock(-1){}   
  5.   
  6. BaseSocket::BaseSocket(SOCKET sock): sock(sock){}   
  7.   
  8. BaseSocket::BaseSocket(const BaseSocket& bsocket): sock(bsocket.sock), addr(bsocket.addr){}   
  9.   
  10. BaseSocket::~BaseSocket(){}   
  11.   
  12. bool BaseSocket::recvChar(char* v)   
  13. {   
  14.     return recvStr(v, sizeof(char));   
  15. }   
  16.   
  17. //-------------------------------------------------------------------------   
  18.   
  19. bool BaseSocket::recvShort(short* v)   
  20. {   
  21.     return recvStr((char*) v, sizeof(short));   
  22. }   
  23.   
  24. //-------------------------------------------------------------------------   
  25.   
  26. bool BaseSocket::recvInt(int* v)   
  27. {   
  28.     return recvStr((char*) v, sizeof(int));   
  29. }   
  30.   
  31. //-------------------------------------------------------------------------   
  32.   
  33. bool BaseSocket::recvLong(long* v)   
  34. {   
  35.     return recvStr((char*) v, sizeof(long));   
  36. }   
  37.   
  38. //-------------------------------------------------------------------------   
  39.   
  40. bool BaseSocket::recvI64(I64* v)   
  41. {   
  42.     return recvStr((char*) v, sizeof(v));   
  43. }   
  44.   
  45. //-------------------------------------------------------------------------   
  46. bool BaseSocket::recvStr(char* str, int len)   
  47. {   
  48.     if (NULL == str || 0 > len)   
  49.         return false;   
  50.   
  51.     if (len == 0)   
  52.         return true;   
  53.   
  54.     int recvLen = ::recv(sock, str, len, 0);   
  55.     if (recvLen <= 0)   
  56.     {   
  57. #ifdef _WIN32__   
  58.             printf("socket recv error? %d\n", GetLastError());   
  59. #endif   
  60. #ifdef _LINUX__   
  61.             printf("socket recv error? %d : %s \n", errno, strerror(errno));   
  62. #endif   
  63.         return false;   
  64.     }   
  65.        
  66.     while (recvLen < len)   
  67.     {   
  68.         int relt = ::recv(sock, str + recvLen, len - recvLen, 0);   
  69.   
  70.         if (relt <= 0)   
  71.         {   
  72. #ifdef _WIN32__   
  73.             printf("socket recv error? %d\n", GetLastError());   
  74. #endif   
  75. #ifdef _LINUX__   
  76.             printf("socket recv error? %d : %s \n", errno, strerror(errno));   
  77. #endif   
  78.             return false;   
  79.         }   
  80.   
  81.         recvLen += relt;   
  82.     }   
  83.   
  84.     return true;   
  85. }   
  86.   
  87. //-------------------------------------------------------------------------   
  88.   
  89. bool BaseSocket::send(char data)   
  90. {   
  91.     return send(&data, sizeof(data));   
  92. }   
  93.   
  94. //-------------------------------------------------------------------------   
  95.   
  96. bool BaseSocket::send(short data)   
  97. {   
  98.     return send((char*)& data, sizeof(data));   
  99. }   
  100.   
  101. //-------------------------------------------------------------------------   
  102.   
  103. bool BaseSocket::send(int data)   
  104. {   
  105.     return send((char*)& data, sizeof(data));   
  106. }   
  107.   
  108. //-------------------------------------------------------------------------   
  109.   
  110. bool BaseSocket::send(long data)   
  111. {   
  112.     return send((char*)& data, sizeof(data));   
  113. }   
  114.   
  115. //-------------------------------------------------------------------------   
  116.   
  117. bool BaseSocket::send(I64 data)   
  118. {   
  119.     return send((char*)& data, sizeof(data));   
  120. }   
  121.   
  122. //-------------------------------------------------------------------------   
  123.   
  124. bool BaseSocket::send(U_I64 data)   
  125. {   
  126.     return send((char*)& data, sizeof(data));   
  127. }   
  128.   
  129. //-------------------------------------------------------------------------   
  130.   
  131. bool BaseSocket::send(char* str, int len)   
  132. {   
  133.     int sendLen = ::send(sock, str, len, 0);   
  134.     if (sendLen < 0)   
  135.     {   
  136. #ifdef _WIN32__   
  137.         printf("socket send error: %d\n", GetLastError());   
  138. #endif   
  139. #ifdef _LINUX__   
  140.         printf("socket send error: %d, %s\n", errno, strerror(errno));   
  141. #endif   
  142.         return false;   
  143.     }   
  144.     while(sendLen < len)   
  145.     {   
  146.         int relt = ::send(sock, str + sendLen, len - sendLen, 0);   
  147.         if (relt < 0)   
  148.         {   
  149. #ifdef _WIN32__   
  150.             printf("socket send error: %d\n", GetLastError());   
  151. #endif   
  152. #ifdef _LINUX__   
  153.             printf("socket send error: %d, %s\n", errno, strerror(errno));   
  154. #endif   
  155.             return false;   
  156.         }   
  157.         sendLen += relt;   
  158.     }   
  159.   
  160.     return true;   
  161. }   
  162.   
  163. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
  164. bool BaseSocket::create(int type)   
  165. {   
  166.     switch (type)   
  167.     {   
  168.         case _TCP:  // (0)_TCP: connection   
  169.             return createTCP();   
  170.         case _UDP:  // (1)_UDP: connection   
  171.             return createUDP();   
  172.         default:   
  173.             return false;   
  174.     }   
  175. }   
  176.   
  177. //-------------------------------------------------------------------------   
  178.   
  179. bool BaseSocket::createTCP()   
  180. {   
  181.     return realCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
  182. }   
  183.   
  184. //-------------------------------------------------------------------------   
  185.   
  186. bool BaseSocket::createUDP()   
  187. {   
  188.     return realCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP);   
  189. }   
  190.   
  191. //-------------------------------------------------------------------------   
  192.   
  193. bool BaseSocket::realCreate(int af, int type, int protocol)   
  194. {   
  195.     sock = socket(af, type, protocol);   
  196.     if (!isValid())   
  197.     {   
  198. #ifdef _WIN32__   
  199.         printf("Create Connect(protocol NO.%d) Error ! : %d\n", protocol, GetLastError());   
  200. #endif   
  201. #ifdef _LINUX__   
  202.         printf("Create Connect(protocol NO.%d) Error ! : %d, %s\n", protocol, errno, strerror(errno));   
  203. #endif   
  204.         return false;   
  205.     }   
  206.     return true;   
  207. }   
  208.   
  209. //-------------------------------------------------------------------------   
  210.   
  211. BaseSocket BaseSocket::accept()   
  212. {   
  213.     struct sockaddr_in clientAddr;   
  214.     //  memset(&clientAddr, 0x00, sizeof(clientAddr));   
  215. #ifdef _WIN32__   
  216.     int len = sizeof(sockaddr_in);   
  217. #endif   
  218. #ifdef _LINUX__   
  219.     socklen_t len = sizeof(sockaddr_in);   
  220. #endif   
  221.     SOCKET sClient = ::accept(sock, (struct sockaddr*)& clientAddr, &len);   
  222.     BaseSocket s(sClient);   
  223.     s.addr = clientAddr;   
  224.     if (!isValid())   
  225.     {   
  226. #ifdef _WIN32__   
  227.             printf("Accept Error ! : %d\n", GetLastError());   
  228. #endif   
  229. #ifdef _LINUX__   
  230.             printf("Accept Error ! : %d, %s\n", errno, strerror(errno));   
  231. #endif   
  232.     }   
  233.     else  
  234.     {   
  235.             printf("accept client connection : %s -- %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));   
  236.     }   
  237.     return s;   
  238. }   
  239.   
  240. //-------------------------------------------------------------------------   
  241.   
  242. bool BaseSocket::connect(const char* ip, unsigned short port)   
  243. {   
  244.     struct sockaddr_in serverAddr;   
  245.     serverAddr.sin_family = AF_INET;   
  246.     serverAddr.sin_port = htons(port);   
  247.     serverAddr.sin_addr.s_addr = inet_addr(ip);   
  248.        
  249.     if (-1 == ::connect(sock, (struct sockaddr*)& serverAddr, sizeof(struct sockaddr)))   
  250.     {   
  251. #ifdef _WIN32__   
  252.         printf("Socket Connect Error: %d\n", GetLastError());   
  253. #endif   
  254. #ifdef _LINUX__   
  255.         printf("Socket Connect Error: %d, %S\n", errno, strerror(errno));   
  256. #endif   
  257.         return false;   
  258.     }   
  259.     printf("socket %s:%d connect.\n", getIP(), getPort());   
  260.     return true;   
  261. }   
  262.   
  263. //-------------------------------------------------------------------------   
  264.   
  265. bool BaseSocket::close()   
  266. {   
  267.     printf("socket %s:%d close.\n", getIP(), getPort());   
  268. #ifdef _WIN32__   
  269.     if (-1 == ::closesocket(sock))   
  270.     {   
  271.         printf("socket close error!\n", GetLastError());   
  272.         return false;   
  273.     }   
  274. #endif   
  275. #ifdef _LINUX__   
  276.     if (-1 == ::close(sock))   
  277.     {   
  278.         printf("socket close error! %d, %s\n", errno, strerror(errno));   
  279.         return false;   
  280.     }   
  281. #endif   
  282.     return true;   
  283. }   
  284.   
  285. //-------------------------------------------------------------------------   
  286.   
  287. bool BaseSocket::bind(unsigned short port)   
  288. {   
  289.     addr.sin_family = AF_INET;   
  290.     addr.sin_port = htons(port);   
  291.     addr.sin_addr.s_addr = htonl(INADDR_ANY);   
  292.     memset(&addr.sin_zero, 0x00, sizeof(addr.sin_zero));   
  293.        
  294.     if (-1 == ::bind(sock, (struct sockaddr*)& addr, sizeof(struct sockaddr)))   
  295.     {   
  296. #ifdef _WIN32__   
  297.         printf("socket bind error! %d\n", GetLastError());   
  298. #endif   
  299. #ifdef _LINUX__   
  300.         printf("socket bind error! %d: %s\n", errno, strerror(errno));   
  301. #endif   
  302.         return false;   
  303.     }   
  304.     return true;   
  305. }   
  306.   
  307. //-------------------------------------------------------------------------   
  308.   
  309. bool BaseSocket::listen(int num)   
  310. {   
  311.     if (-1 == ::listen(sock, num))   
  312.     {   
  313. #ifdef _WIN32__    
  314.         printf("listen error! %d\n", GetLastError());   
  315. #endif   
  316. #ifdef _LINUX__   
  317.         printf("listen error! %d: %s", errno, strerror(errno));   
  318. #endif   
  319.   
  320.         return false;   
  321.     }   
  322.     return true;   
  323. }   
  324.   
  325. //-------------------------------------------------------------------------   
  326.   
  327. bool BaseSocket::isValid()   
  328. {   
  329.     return -1 != sock;   
  330. }   
  331.   
  332. //-------------------------------------------------------------------------   
  333.   
  334. unsigned short BaseSocket::getPort() const  
  335. {   
  336.     return (unsigned short) (::ntohs(addr.sin_port));   
  337. }   
  338.   
  339. //-------------------------------------------------------------------------   
  340.   
  341. char* BaseSocket::getIP()const  
  342. {   
  343.     char* p = ::inet_ntoa(addr.sin_addr);   
  344.     if (NULL == p)   
  345.     {   
  346. #ifdef _WIN32__   
  347.         printf("Socket Get IP Error: %d\n", GetLastError());   
  348. #endif   
  349. #ifdef _LINUX__   
  350.         printf("Socket Get IP Error: %d, %s\n", errno, strerror(errno));   
  351. #endif   
  352.     }   
  353.     return p;   
  354. }   
  355.   
  356. //-------------------------------------------------------------------------   
  357.   
  358. bool BaseSocket::setTimeOut(int milliSec)   
  359. {   
  360.     if (!isValid())   
  361.         return false;   
  362.        
  363. #ifdef _WIN32__    
  364.     int time = milliSec;   
  365. #endif   
  366. #ifdef _LINUX__   
  367.        
  368.     struct timeval time;   
  369.     time.tv_sec = (milliSec / 1000);//???   
  370. #endif   
  371.     if (-1 == setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)& time, sizeof(time)))   
  372.     {   
  373. #ifdef _WIN32__   
  374.         printf("Socket Set Timeout Error: %d\n", GetLastError());   
  375. #endif   
  376.   
  377. #ifdef _LINUX__   
  378.         printf("Socket Set Timeout Error: %d, %s\n", errno, strerror(errno));   
  379. #endif   
  380.         return false;   
  381.     }   
  382.        
  383.         if (-1 == setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)& time, sizeof(time)))   
  384.     {   
  385. #ifdef _WIN32__   
  386.         printf("Socket Set Timeout Error: %d\n", GetLastError());   
  387. #endif   
  388.   
  389. #ifdef _LINUX__   
  390.         printf("Socket Set Timeout Error: %d, %s\n", errno, strerror(errno));   
  391. #endif   
  392.         return false;   
  393.     }   
  394.     return true;   
  395. }   
  396.   
  397. //-------------------------------------------------------------------------   
  398.   
  399. bool BaseSocket::init()   
  400. {   
  401. #ifdef _WIN32__   
  402.     WSAData wsaData;   
  403.     if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))   
  404.     {   
  405.         printf("WSA Startup Error : %d \n", GetLastError());   
  406.         return false;   
  407.     }   
  408.     return true;   
  409. #else  
  410.     return true;   
  411. #endif     
  412. }   
  413.   
  414. //-------------------------------------------------------------------------   
  415.   
  416. bool BaseSocket::destroy()   
  417. {   
  418. #ifdef _WIN32__   
  419.     if (0 != WSACleanup())   
  420.     {   
  421.         printf("WSA Startup Error : %d \n", GetLastError());   
  422.         return false;   
  423.     }   
  424.     return true;   
  425. #else  
  426.     return true;   
  427. #endif     
  428.        
  429. }  

#include "BaseSocket.h"#include <cstdio>BaseSocket::BaseSocket(): sock(-1){}BaseSocket::BaseSocket(SOCKET sock): sock(sock){}BaseSocket::BaseSocket(const BaseSocket& bsocket): sock(bsocket.sock), addr(bsocket.addr){}BaseSocket::~BaseSocket(){}bool BaseSocket::recvChar(char* v){ return recvStr(v, sizeof(char));}//-------------------------------------------------------------------------bool BaseSocket::recvShort(short* v){ return recvStr((char*) v, sizeof(short));}//-------------------------------------------------------------------------bool BaseSocket::recvInt(int* v){ return recvStr((char*) v, sizeof(int));}//-------------------------------------------------------------------------bool BaseSocket::recvLong(long* v){ return recvStr((char*) v, sizeof(long));}//-------------------------------------------------------------------------bool BaseSocket::recvI64(I64* v){ return recvStr((char*) v, sizeof(v));}//-------------------------------------------------------------------------bool BaseSocket::recvStr(char* str, int len){ if (NULL == str || 0 > len) return false; if (len == 0) return true; int recvLen = ::recv(sock, str, len, 0); if (recvLen <= 0) {#ifdef _WIN32__ printf("socket recv error? %d\n", GetLastError());#endif#ifdef _LINUX__ printf("socket recv error? %d : %s \n", errno, strerror(errno));#endif return false; } while (recvLen < len) { int relt = ::recv(sock, str + recvLen, len - recvLen, 0); if (relt <= 0) {#ifdef _WIN32__ printf("socket recv error? %d\n", GetLastError());#endif#ifdef _LINUX__ printf("socket recv error? %d : %s \n", errno, strerror(errno));#endif return false; } recvLen += relt; } return true;}//-------------------------------------------------------------------------bool BaseSocket::send(char data){ return send(&data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(short data){ return send((char*)& data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(int data){ return send((char*)& data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(long data){ return send((char*)& data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(I64 data){ return send((char*)& data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(U_I64 data){ return send((char*)& data, sizeof(data));}//-------------------------------------------------------------------------bool BaseSocket::send(char* str, int len){ int sendLen = ::send(sock, str, len, 0); if (sendLen < 0) {#ifdef _WIN32__ printf("socket send error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("socket send error: %d, %s\n", errno, strerror(errno));#endif return false; } while(sendLen < len) { int relt = ::send(sock, str + sendLen, len - sendLen, 0); if (relt < 0) {#ifdef _WIN32__ printf("socket send error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("socket send error: %d, %s\n", errno, strerror(errno));#endif return false; } sendLen += relt; } return true;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////bool BaseSocket::create(int type){ switch (type) { case _TCP: // (0)_TCP: connection return createTCP(); case _UDP: // (1)_UDP: connection return createUDP(); default: return false; }}//-------------------------------------------------------------------------bool BaseSocket::createTCP(){ return realCreate(AF_INET, SOCK_STREAM, IPPROTO_TCP);}//-------------------------------------------------------------------------bool BaseSocket::createUDP(){ return realCreate(AF_INET, SOCK_DGRAM, IPPROTO_UDP);}//-------------------------------------------------------------------------bool BaseSocket::realCreate(int af, int type, int protocol){ sock = socket(af, type, protocol); if (!isValid()) {#ifdef _WIN32__ printf("Create Connect(protocol NO.%d) Error ! : %d\n", protocol, GetLastError());#endif#ifdef _LINUX__ printf("Create Connect(protocol NO.%d) Error ! : %d, %s\n", protocol, errno, strerror(errno));#endif return false; } return true;}//-------------------------------------------------------------------------BaseSocket BaseSocket::accept(){ struct sockaddr_in clientAddr; // memset(&clientAddr, 0x00, sizeof(clientAddr));#ifdef _WIN32__ int len = sizeof(sockaddr_in);#endif#ifdef _LINUX__ socklen_t len = sizeof(sockaddr_in);#endif SOCKET sClient = ::accept(sock, (struct sockaddr*)& clientAddr, &len); BaseSocket s(sClient); s.addr = clientAddr; if (!isValid()) {#ifdef _WIN32__ printf("Accept Error ! : %d\n", GetLastError());#endif#ifdef _LINUX__ printf("Accept Error ! : %d, %s\n", errno, strerror(errno));#endif } else { printf("accept client connection : %s -- %d\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port)); } return s;}//-------------------------------------------------------------------------bool BaseSocket::connect(const char* ip, unsigned short port){ struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = inet_addr(ip); if (-1 == ::connect(sock, (struct sockaddr*)& serverAddr, sizeof(struct sockaddr))) {#ifdef _WIN32__ printf("Socket Connect Error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("Socket Connect Error: %d, %S\n", errno, strerror(errno));#endif return false; } printf("socket %s:%d connect.\n", getIP(), getPort()); return true;}//-------------------------------------------------------------------------bool BaseSocket::close(){ printf("socket %s:%d close.\n", getIP(), getPort());#ifdef _WIN32__ if (-1 == ::closesocket(sock)) { printf("socket close error!\n", GetLastError()); return false; }#endif#ifdef _LINUX__ if (-1 == ::close(sock)) { printf("socket close error! %d, %s\n", errno, strerror(errno)); return false; }#endif return true;}//-------------------------------------------------------------------------bool BaseSocket::bind(unsigned short port){ addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); memset(&addr.sin_zero, 0x00, sizeof(addr.sin_zero)); if (-1 == ::bind(sock, (struct sockaddr*)& addr, sizeof(struct sockaddr))) {#ifdef _WIN32__ printf("socket bind error! %d\n", GetLastError());#endif#ifdef _LINUX__ printf("socket bind error! %d: %s\n", errno, strerror(errno));#endif return false; } return true;}//-------------------------------------------------------------------------bool BaseSocket::listen(int num){ if (-1 == ::listen(sock, num)) {#ifdef _WIN32__ printf("listen error! %d\n", GetLastError());#endif#ifdef _LINUX__ printf("listen error! %d: %s", errno, strerror(errno));#endif return false; } return true;}//-------------------------------------------------------------------------bool BaseSocket::isValid(){ return -1 != sock;}//-------------------------------------------------------------------------unsigned short BaseSocket::getPort() const{ return (unsigned short) (::ntohs(addr.sin_port));}//-------------------------------------------------------------------------char* BaseSocket::getIP()const{ char* p = ::inet_ntoa(addr.sin_addr); if (NULL == p) {#ifdef _WIN32__ printf("Socket Get IP Error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("Socket Get IP Error: %d, %s\n", errno, strerror(errno));#endif } return p;}//-------------------------------------------------------------------------bool BaseSocket::setTimeOut(int milliSec){ if (!isValid()) return false; #ifdef _WIN32__ int time = milliSec;#endif#ifdef _LINUX__ struct timeval time; time.tv_sec = (milliSec / 1000);//???#endif if (-1 == setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)& time, sizeof(time))) {#ifdef _WIN32__ printf("Socket Set Timeout Error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("Socket Set Timeout Error: %d, %s\n", errno, strerror(errno));#endif return false; } if (-1 == setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)& time, sizeof(time))) {#ifdef _WIN32__ printf("Socket Set Timeout Error: %d\n", GetLastError());#endif#ifdef _LINUX__ printf("Socket Set Timeout Error: %d, %s\n", errno, strerror(errno));#endif return false; } return true;}//-------------------------------------------------------------------------bool BaseSocket::init(){#ifdef _WIN32__ WSAData wsaData; if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData)) { printf("WSA Startup Error : %d \n", GetLastError()); return false; } return true;#else return true;#endif }//-------------------------------------------------------------------------bool BaseSocket::destroy(){#ifdef _WIN32__ if (0 != WSACleanup()) { printf("WSA Startup Error : %d \n", GetLastError()); return false; } return true;#else return true;#endif }

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-12

main方法

Java代码 问个socket的问题。 - phperwuhan - phperwuhan的博客

  1. int main(int argc, char* argv[])   
  2. {   
  3.     BaseSocket qsSocket;   
  4.        
  5.     if (!qsSocket.create(_TCP))   
  6.         return -1;   
  7.     if (!qsSocket.bind((unsigned short) 8888))   
  8.         return -1;   
  9.     if (!qsSocket.listen(5))   
  10.         return -1;   
  11.        
  12.     char* str= "Logger.default.grade=INFO;中国人名共和国";   
  13.     int len = (int) strlen(str);   
  14.     BaseSocket csock = qsSocket.accept();   
  15.     int v;   
  16.     while(true)   
  17.     {   
  18.         csock.send(len);   
  19.         csock.send(str, len);   
  20.         csock.recvInt(&v);   
  21.         printf("v = %d\n", v);   
  22.     }   
  23.     return 0;   
  24. }  

int main(int argc, char* argv[]){ BaseSocket qsSocket; if (!qsSocket.create(_TCP)) return -1; if (!qsSocket.bind((unsigned short) 8888)) return -1; if (!qsSocket.listen(5)) return -1; char* str= "Logger.default.grade=INFO;中国人名共和国"; int len = (int) strlen(str); BaseSocket csock = qsSocket.accept(); int v; while(true) { csock.send(len); csock.send(str, len); csock.recvInt(&v); printf("v = %d\n", v); } return 0;}

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-12

上面是server的测试代码。client的是java写的。就不帖了。但是,当client端关闭的时候,整个应用程序都死掉了。我看了一下server的错误信息,是:socket recv error 104 : Connection reset by peer.但是,一个socket通信失败,不应该把整个程序都down掉啊。实在找不出原因了。请赐教

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-13

大侠们都来看看啊。阿!

问个socket的问题。 - phperwuhan - phperwuhan的博客

qiezi 2007-06-14

客户端和服务器是在内网吗?通常断开服务器会得到通知,这时recv返回是0。但非正常断开则不一定,比如拔网线,这可能要等到TCP超时,这个时间非常长。这样阻塞接收最好是设一下socket超时,通常编写服务器最好是采用事件方式,有数据时处理,而不是这样阻塞线程,当然简单应用是可以的。

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-14

这个东西,找到原因.是因为,socket接受或者发送数据失败的时候, 系统给了一个sigpipe信号.导致程序退出.现在这个问题倒是解决了.注册一个信号捕捉函数.然后处理就可以了.

qiezi 写道

客户端和服务器是在内网吗?通常断开服务器会得到通知,这时recv返回是0。但非正常断开则不一定,比如拔网线,这可能要等到TCP超时,这个时间非常长。

是内网.而且,这个不知道为什么常常发生.表现在数据还没有完全接受完毕.然后,就出现recv的返回值为0的情况.实在不知道怎么回事了.没有办法.只能认为这次操作失败了.

qiezi 写道

这样阻塞接收最好是设一下socket超时,

我在编写程序的时候,已经设置了超时.

qiezi 写道

通常编写服务器最好是采用事件方式,有数据时处理,而不是这样阻塞线程,当然简单应用是可以的。

这个不知道怎么用.能不能举个简单的例子.能有代码最好,而且希望能配上注释. ^-^

问个socket的问题。 - phperwuhan - phperwuhan的博客

qiezi 2007-06-14

那是broken pipe,是要处理掉的。

事件方式最简单的可以采用select,跨平台,搜索一下就有了。更深入点的,windows上有IOCP,linux下有poll/epoll/aio等。

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-14

qiezi 写道

那是broken pipe,是要处理掉的。

事件方式最简单的可以采用select,跨平台,搜索一下就有了。更深入点的,windows上有IOCP,linux下有poll/epoll/aio等。

多谢。不懂再请教。

 

 

问个socket的问题。 - phperwuhan - phperwuhan的博客

xlw 2007-06-16

直接使用boost::asio就好了。

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-06-18

xlw 写道

直接使用boost::asio就好了。

boost库没有用过。甚至于stl也没有用过。主要还是自己写。

问个socket的问题。 - phperwuhan - phperwuhan的博客

xombat 2007-06-23

自己写? 我也用c语言写过web服务器,你那个问题我解决过,就是sigpipe信号的处理问题。

我没看你的代码,不知道你的服务器是怎么设计的,我可以说一说我的服务器设计,我总觉得不好,太过复杂,大家可以商讨商讨。

索性写了一篇博客,设计就在这里了:

http://xombat.javaeye.com/admin/show/93518

问个socket的问题。 - phperwuhan - phperwuhan的博客

wenlango 2007-06-24

test

问个socket的问题。 - phperwuhan - phperwuhan的博客

RyanPoy 2007-07-03

发错了。删了

  评论这张
 
阅读(858)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017