回射程式3 客戶端 客戶伺服器不定長接收資料

2021-06-21 11:14:13 字數 3652 閱讀 8311

又是乙個回射程式!!!!

畢竟還是乙隻小菜鳥,多練練,多寫寫沒有壞處滴!

這次的回射程式思路如下:

客戶端和伺服器都使用了新的函式recvvl來接收資料了!!這是乙個自己編寫的函式,主要作用是接收不定長的資料。

整個程式的設計思路是這樣的:

客戶端首先將訊息體的長度傳送給伺服器,再將訊息體傳送給伺服器。

在伺服器端先接收到訊息體的長度,緊接著根據該長度接收相應的資料。

雖然上面接收資料看上去要用兩步,但是我們把它放在同乙個函式中了!

該函式的實現需要呼叫前面編寫的recvn函式。其實現如下:

int recvvl(socket s, char * recvbuf, unsigned int recvbuflen)

else

} //轉換網路位元組順序到主機位元組順序

reclen = ntohl( reclen );

if ( reclen > recvbuflen )

else

}reclen -= recvbuflen;

//處理最後一段資料長度

if ( reclen < recvbuflen )

recvbuflen = reclen;

} printf("可變長度的訊息超出預分配的接收快取\r\n");

return -1;

} //接收可變長訊息

iresult = recvn( s, recvbuf, reclen );

if ( iresult != reclen )

else

} return iresult;

}

函式引數說明:socket s 連線套接字

char * recvbuf  接收快取

unsigned int recvbuflen  快取區的大小

值得注意的是,在接收過程中,需要將接收到的資料長度資訊進行位元組序的轉換!!

//轉換網路位元組順序到主機位元組順序

reclen = ntohl( reclen );

在傳送資料長度之前,需要進行htonl的轉換!!

下面貼上客戶端的**:

// 回顯客戶端3.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include#include #include #include #pragma comment(lib,"wsock32.lib")

#define maxsize 100

//函式宣告

int recvn(socket s, char * recvbuf, unsigned int fixedlen);

int recvvl(socket s, char * recvbuf, unsigned int recvbuflen);

int _tmain(int argc, _tchar* argv)

if(lobyte(wsadata.wversion)!=2||hibyte(wsadata.wversion)!=2)

//建立客戶端套接字

socket sockclient;

sockclient = socket(af_inet,sock_stream,0);

if(sockclient==invalid_socket)

//伺服器位址資訊

struct sockaddr_in saserver;

saserver.sin_family = af_inet;

saserver.sin_port=htons(6000);

saserver.sin_addr.s_un.s_addr = inet_addr("127.0.0.1");

//連線伺服器

ret = connect(sockclient,(sockaddr*)&saserver,sizeof(saserver));

if(ret == socket_error)

else

printf("connect successed\n");

//向伺服器傳送資料

//首先傳送定長的訊息宣告本次傳輸的訊息長度

//再傳送變長的訊息體

unsigned int slen = 0;

unsigned int buflen = maxsize;

char buff[maxsize]; //傳送快取

char recvbuff[maxsize]; //接收快取

//memset(buff, 0 , maxsize);

while (true)

if(send(sockclient, buff, strlen(buff), 0) <= 0)

ret = recvvl(sockclient,recvbuff,buflen);

if(ret==socket_error)

else if(wsaeshutdown == nerrcode)

else if (wsaetimedout == nerrcode)

else if (wsaeconnreset == nerrcode)

else{}

closesocket(sockclient);

wsacleanup();

return -1;

} //列印收到的回顯字串

printf("%s\n",recvbuff);

} closesocket(sockclient);

wsacleanup();

return 0;

}//指定長度接收

int recvn(socket s, char * recvbuf, unsigned int fixedlen)

if ( iresult == 0 )

//printf("接收到的位元組數: %d\n", iresult);

//接收快取指標向後移動

recvbuf +=iresult;

//更新cnt值

cnt -=iresult;

} return fixedlen;

}int recvvl(socket s, char * recvbuf, unsigned int recvbuflen)

else

} //轉換網路位元組順序到主機位元組順序

reclen = ntohl( reclen );

if ( reclen > recvbuflen )

else

}reclen -= recvbuflen;

//處理最後一段資料長度

if ( reclen < recvbuflen )

recvbuflen = reclen;

} printf("可變長度的訊息超出預分配的接收快取\r\n");

return -1;

} //接收可變長訊息

iresult = recvn( s, recvbuf, reclen );

if ( iresult != reclen )

else

} return iresult;

}

回射程式3 伺服器 客戶伺服器不定長接收資料

貼上伺服器的 回顯伺服器3.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include pragma comment lib,wsock32.lib define serverprot 6000 define maxsize ...

TCP伺服器 客戶端程式

server tcpserver.cpp檔案 include common initsock.h include cinitsock initsock 初始化winsock庫 int main 填充sockaddr in結構 sockaddr in sin sin.sin family af ine...

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...