tcpaf(TCPA翻译)

      最后更新:2023-03-24 04:01:30 手机定位技术交流文章

      网络通信数据TCP传输时好时坏,寻求高人

      //取出数据,这里发现数据接收不完整。。。。 int nRecv = recv(cliSock, buf, sizeof(CStock)*(N+2), 0);你没有判断到底返回了多少数据,而只是检查了《=0.你怎么知道数据是否接受完毕?另外你还要确定,对方是否采取了优雅关闭。否则有可能丢失数据。你可以参考一下MSDN的示例:----------------------------------------------------------------#include #include #define DEFAULT_BUFLEN 512#define DEFAULT_PORT "27015"int __cdecl main() {//----------------------// Declare and initialize variables.WSADATA wsaData;int iResult;SOCKET ConnectSocket;struct sockaddr_in clientService;char *sendbuf = "this is a test";char recvbuf[DEFAULT_BUFLEN];int recvbuflen = DEFAULT_BUFLEN;//----------------------// Initialize WinsockiResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR) {printf("WSAStartup failed: %dn", iResult);return 1;}//----------------------// Create a SOCKET for connecting to serverConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ConnectSocket == INVALID_SOCKET) {printf("Error at socket(): %ldn", WSAGetLastError() );WSACleanup();return 1;}//----------------------// The sockaddr_in structure specifies the address family,// IP address, and port of the server to be connected to.clientService.sin_family = AF_INET;clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );clientService.sin_port = htons( 27015 );//----------------------// Connect to server.iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );if ( iResult == SOCKET_ERROR) {closesocket (ConnectSocket);printf("Unable to connect to server: %ldn", WSAGetLastError());WSACleanup();return 1;}// Send an initial bufferiResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );if (iResult == SOCKET_ERROR) {printf("send failed: %dn", WSAGetLastError());closesocket(ConnectSocket);WSACleanup();return 1;}printf("Bytes Sent: %ldn", iResult);// shutdown the connection since no more data will be sentiResult = shutdown(ConnectSocket, SD_SEND);if (iResult == SOCKET_ERROR) {printf("shutdown failed: %dn", WSAGetLastError());closesocket(ConnectSocket);WSACleanup();return 1;}// Receive until the peer closes the connectiondo {iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);if ( iResult > 0 )printf("Bytes received: %dn", iResult);else if ( iResult == 0 )printf("Connection closedn");elseprintf("recv failed: %dn", WSAGetLastError());} while( iResult > 0 );// cleanupclosesocket(ConnectSocket);WSACleanup();return 0; }
      您的rp问题吧,我看没什么问题,愚见而已。
      A机 <-B机:接收数据完整!!! 是指AB的C/S身份互换一下,数据就完整吗?换身份可以的话,难道是B机的防火墙之类、协议内部缓冲区大小等的设置有不同?你把int nRecv = recv(cliSock, buf, sizeof(CStock)*(N+2), 0);if(nRecv <=0){}换成循环检测nRecv大小,直到为0,试一下?说不定RP会变好的呵呵。int nRecv = 0;int pos=0;while (1){nRecv=recv(cliSock, buf+pos, sizeof(CStock)*(N+2)-pos, 0));if(nRecv <=0){break;}else{pos+=nRecv} }
      网络通信数据TCP传输时好时坏,寻求高人

      如何设置TCP sokcet连接的超时时间

      如果你确定,真的不需要等这么久,或者用户希望可以随时中上连接过程,那么一般是用 非阻塞模式来做的. 看看我的这段连接代码(节选),可以作为TCP连接的典范: bool CRemoteLink::Connect(){OnDisconnected(); // 如果已经连接,则断开if(!m_bUseProxy){m_iConnStatus = SS_CONNECTING;// 正在连接状态GNTRACE ("开始连接到远程服务器[%s][%ld]...n", m_strip.c_str(), m_port);// 建立套接字, 准备连接到服务器m_socket = ::socket(AF_INET, SOCK_STREAM, 0);if (socket < 0) {if(m_pCallBack)m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);return false;}// 设为异步操作方式unsigned long on = 1;if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {::closesocket(m_socket);if(m_pCallBack)m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);return false;}sockaddr_in addr;memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(m_strip.c_str());addr.sin_port = htons(m_port);int rt;rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr));if (rt == 0) {OnConnected();return true;}// ==================================================================timeval to;// 首先建立连接fd_set wfds;fd_set efds;FD_ZERO(&wfds);FD_ZERO(&efds);// test shutdown event each 100ms.to.tv_sec = 0;// CONNECT_TIMEOUT;to.tv_usec = 100000;int it = 0;while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0)){FD_SET(m_socket, &wfds);FD_SET(m_socket, &efds);int n = select(m_socket + 1, NULL, &wfds, &efds, &to);if (n > 0) {if(FD_ISSET(m_socket, &wfds)){OnConnected();return true;}else{//int err = ::WSAGetLastError();//const char*msg = GetLastErrorMessage(err);GNTRACE ("CRemoteLink::Connect : connection attempt failed!n");if(m_pCallBack)m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN);break;}} else if (n < 0) {// Select Errorint err = ::WSAGetLastError();const char*msg = GetLastErrorMessage(err);GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %sn", err, msg);if(m_pCallBack)m_pCallBack->OnSocketError(err, msg);break;}else{it += 100;if(it > 30000)// 连接超时 -- (30S){GNTRACE ("CRemoteLink::Connect : Time out.n");if(m_pCallBack)m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT);break;}}}if(m_meConnStop.Wait(0)){GNTRACE("连接过程进行时被取消。n");}}else{// 通过代理服务器连接 转载
      如何设置TCP sokcet连接的超时时间

      tcp并发服务器通讯模型有哪些

      服务器创建并绑定套接字后fork出几个子进程,子进程中分别进行accept(该函数为阻塞函数)、recv、处理数据然后再次acept,这样循环下去。所有客户端发来的信息都是直接由子进程处理。 例程代码如下,在处理客户端请求之前,服务器先fork了3个子进程,然后将客户端的请求直接交由子进程处理。该例程中,服务器fork子进程后,子进程监听并接收客户端的信息,然后打印客户端发来的信息和自己的id(id代表自己是第几个子进程)服务器端代码:/**************************************author:arvikpurpose:test the server simultaneityemail:1216601195@qq.comcsdn:http://blog.csdn.net/u012819339**************************************/#include #include #include #include #include #include #include #include #define BUFFLEN 1024#define SERVER_PORT 8887#define BACKLOG 5#define PIDNUMB 3static void handle_connect(int s_s, int id){int s_c;struct sockaddr_in from;//client addrsocklen_t len = sizeof(from);while(1){s_c = accept(s_s, (struct sockaddr*)&from, &len);char buff[BUFFLEN];memset(buff, 0, BUFFLEN);int n = recv(s_c, buff, BUFFLEN, 0);//non blockif(n > 0){printf("This process id is: %d nreveive from client: %sn", id, buff);}close(s_c);}}void sig_int(int num){exit(1);}int main(int argc, char **argv){int s_s;struct sockaddr_in local;signal(SIGINT, sig_int);s_s = socket(AF_INET, SOCK_STREAM, 0);memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_addr.s_addr = htonl(INADDR_ANY);local.sin_port = htons(SERVER_PORT);bind(s_s, (struct sockaddr*)&local, sizeof(local));listen(s_s, BACKLOG);pid_t pid[PIDNUMB];for(int i = 0; i#include #include #include #include #include #include #include #define BUFFLEN 24#define SERVER_PORT 8887int main(){int s_c;struct sockaddr_in server;char buff[] = "hello";s_c = socket(AF_INET, SOCK_STREAM, 0);memset(&server, 0, sizeof(server));server.sin_family = AF_INET;server.sin_addr.s_addr = htonl(INADDR_ANY); //any local addressserver.sin_port = htons(SERVER_PORT);connect(s_c, (struct sockaddr*)&server, sizeof(server));send(s_c, buff, strlen(buff), 0);sleep(1);close(s_c);return 0; }
      tcp并发服务器通讯模型有哪些

      Windows系统用C语言写TCP通信

      #include #include#include#pragma comment(lib,"ws2_32.lib")typedef struct{SOCKET accpt;int lock;}Arg;void *transfer(void *arg){Arg * info = (Arg *)arg;SOCKET clientSock;char recvbuf[102];char sendBuf[] = "10";int ret;memcpy(&clientSock,(void*)&info->accpt,sizeof(clientSock));info->lock =1;while (TRUE){ret = send(clientSock,sendBuf,2,0);if (ret == -1){break;}ret = recv(clientSock,recvbuf,102,0);printf("%sn",recvbuf);}return (void *)0;}void* timer(void *arg){time_t last = time(NULL);time_t now;int i = 20;while(i--){now = time(NULL);if(now - last == 1){printf("1s past!n");last = now;}Sleep(500);}printf("timer exit.n");return (void *)0;}int main(void) {WSADATA wsaData;SOCKET ListenSocket;SOCKADDR_IN service,client;int len = sizeof(client);Arg argument;pthread_t tid;char sendBuf[] = "ID=2;WHAT=host";int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR) {printf("Error at WSAStartup()n");return 1;}ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ListenSocket == INVALID_SOCKET) {printf("Error at socket(): %ldn", WSAGetLastError());WSACleanup();return 1;}service.sin_family = AF_INET;service.sin_addr.s_addr = inet_addr("127.0.0.1");service.sin_port = htons(27115);if (bind( ListenSocket,(SOCKADDR*) &service,sizeof(service)) == SOCKET_ERROR) {printf("bind() failed.n");closesocket(ListenSocket);WSACleanup();return 1;}if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {printf("Error listening on socket.n");closesocket(ListenSocket);WSACleanup();return 1;}argument.lock = 1;printf("Waiting for client to connect...n");pthread_create(&tid,NULL,timer,NULL);while(TRUE){argument.accpt = accept( ListenSocket, (SOCKADDR*)&client, &len );if (argument.accpt == INVALID_SOCKET) {printf("accept failed: %dn", WSAGetLastError());closesocket(ListenSocket);WSACleanup();return 1;} else {printf("accept%s:%dn",inet_ntoa(client.sin_addr),client.sin_port);while (!argument.lock);argument.lock = 0;// sendto(argument.accpt,sendBuf,sizeof(sendBuf),0,(SOCKADDR*)&client,len);pthread_create(&tid,NULL,transfer,&argument);//send(AcceptSocket,sendBuf,sizeof(sendBuf),0);}}// No longer need server socketclosesocket(ListenSocket);WSACleanup();return 0; }
      Windows系统用C语言写TCP通信

      如何实现TCP和UDP传输

      您好,很高兴能帮助您, CMyAsyncSocket mysocket = socket(AF_INET,sock_stream,..);当你创建对象初始化的时候,已经确定了吧msdn说明:OnSendNotifies a socket that it can send data by calling Send.通知一个socket,可以使用Send函数进行数据的发送了。CAsyncSocketClass CAsyncSocket encapsulates the Windows Socket Functions API, providing an object-oriented abstraction for programmers who want to use Windows Sockets in conjunction with MFC.CAsyncSocket 实现了Windows Socket Functions API,实际上也是对原始socket的另一种实现。CAsyncSocket 也是通过阻塞的套接字来实现异步功能的,只不过是自己处理了发 生的阻塞。所以,OnSend()是通知可以进行Send的一个消息处理函数。你的采纳是我前进的动力,还有不懂的地方,请你继续“追问”! 如你还有别的问题,可另外向我求助;答题不易,互相理解,互相帮助!
      如何实现TCP和UDP传输

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/59706.html

          热门文章

          文章分类