tcp的socket编程(基于tcp的socket编程)

      最后更新:2023-10-23 22:50

      采用tcp协议的socket编程,假如服务器端不知道所要接收的数据的长度,如何定义接收buff的大小?

      tcp是数据流。 如果你第一次的recv不能接收全部数据,可以再次调用recv接收剩余的。具体点:你在发送的时候可以把数据长度写在前4个字节,或者先发送数据长度过来。接收的时候就能先知道数据长度,再动态分配内存,接收剩余数据。 这是socket中非常常用的方法。
      服务器端规定了socket接口形式,是客户端必须遵循的,否则连不上。buff的大小,那也是服务器规定的
      采用tcp协议的socket编程,假如服务器端不知道所要接收的数据的长度,如何定义接收buff的大小?

      简述基于TCP和UDP的Socket编程的异同

      Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM). 流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。 数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。
      tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。
      tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。 TCP是一种很保险的链接,需要三次握手,所以数据的发送不会丢失,能根据网络的拥塞自动调整发送的时延,,,而UDP是一种不保险的链接,数据发出去后不管对面会不会收到,多用于语音视频通话中。
      实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。 具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp
      简述基于TCP和UDP的Socket编程的异同

      用c语言写个 socket 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;}发送数据格式按需求。可以发送字符串,也可以发送结构体。如果发送结构体的话,要注意序列化和反序列化。程序例子是服务器对每个客户端的connect动作起一个线程去交互。还有一个线程是定时器。
      用c语言写个 socket tcp 的

      基于TCP面向连接的socket编程。运行出错,一直出现 “烫”字。用的vs2010

      char RecvBuf[100]; recv(SocketClient,RecvBuf,100,0);//接收服务器数据printf("%sn",RecvBuf);也许没有接收到数据,所以在printf()输出时输出了没有初始化的字串。你可以试一下:char RecvBuf[100]={""};recv(SocketClient,RecvBuf,100,0);//接收服务器数据 printf("%sn",RecvBuf);
      char RecvBuf[100]; recv(ScoketConn,RecvBuf,100,0);//step5 接收数据printf("%sn",RecvBuf);问题出在这里,字符串的显示,字符串末尾必须以‘'结束,否则显示会出错。这样试试:char RecvBuf[101];recv(ScoketConn,RecvBuf,100,0);//step5 接收数据RecvBuf[100] = ''; printf("%sn",RecvBuf);
      recv(ScoketConn,RecvBuf,100,0);//step5 接收数据 两种修改办法:1,memset(buff,0,sizeof(buff)); 将buff全部置为0 2,int n = recv(...); buff[n] = '';
      你用的是两台电脑么,如果是,请更换客户端IP地址为服务器端IP!
      数组接收的时候,后面是空的,等于说数组要接受十个,你只收到九个,就会有烫。
      基于TCP面向连接的socket编程。运行出错,一直出现 “烫”字。用的vs2010

      C语言实现socket编程TCP通信的问题?

      我做试验,发现是如果你这样写: char sendbuf[1024] = {"123456n"}; 也就是发送数据加上了换行,服务端立即显示了。看来不加换行就被缓存了(应该是被服务端收到但缓存了)。
      兄嘚,这是缓存问题。可以write之后用fflush清空
      C语言实现socket编程TCP通信的问题?

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类