首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

传输层网络数据收发,该如何处理

2012-03-09 
传输层网络数据收发我有一个这样的实验,代码老师给了要我们回去看,然后实验课上针对代码提问,比如某个函数

传输层网络数据收发
我有一个这样的实验,代码老师给了要我们回去看,然后实验课上针对代码提问,比如某个函数的作用,某个参数的意思,程序使用C++编的,不长,但我几乎看不懂,希望哪位高手帮我看看,给程序尽量详细的注释一下,谢谢了客户方程序
#include "windows.h"
#include "stdio.h"
#define DATA "half a league, half a league ..."
/* 这个程序建立套接字,然后与命令行给出的套接字连接;连接结束时,在连接上发送
一个消息,然后关闭套接字。命令行的格式是:streamc 主机名 端口号 
端口号要与服务器程序的端口号相同 */
main(int argc, char * argv[])
{
int sock;
struct sockaddr_in server;
struct hostent *hp;
char buf[1024];
WSADATA WSADAtA; 
if (WSAStartup(MAKEWORD(2,2),&WSADAtA))
{
printf("WSAStArtup fAiled:%d\n",GetLastError());
return -1;
}

/* 建立套接字 */
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
/* 使用命令行中指定的名字连接套接字 */
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == 0) {
fprintf(stderr, "%s: unknown host \n", argv[1]);
exit(2); 
}
memcpy((char*)&server.sin_addr, (char*)hp->h_addr, hp->h_length);
server.sin_port = htons(5656);
if (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0) {
perror("connecting stream socket");
exit(3);
}
while(1)
{
if (send(sock, DATA, sizeof(DATA),0) < 0)
perror("sending on stream socket" );
Sleep(200);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
服务器方程序
* File Name: streams.c */
#include "windows.h"
#include "stdio.h"
#define TRUE 1
/* 这个程序建立一个套接字,然后开始无限循环;每当它通过循环接收到一个连接,则打印出一个信息。当连接断开,或接收到终止信息,则此连接结束,程序再接收一个新的连接。命令行的格式是:streams */
main( )
{
int sock, length;
struct sockaddr_in server;
struct sockaddr tcpaddr;
int msgsock;
char buf[1024];
int rval, len;
/* 建立套接字 */
WSADATA WSADAtA; 
if (WSAStartup(MAKEWORD(2,2),&WSADAtA))
{
printf("WSAStArtup fAiled:%d\n",GetLastError());
return -1;
}

server.sin_family = AF_INET;  
  server.sin_addr.S_un.S_addr = INADDR_ANY;// = htonl(inaddr_any);  
server.sin_port = htons(5656); 
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
/* 使用任意端口命名套接字 */ 

if (bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("binding stream socket");
exit(1);
}
/* 找出指定的端口号并打印出来 */
length = sizeof(server);
if (getsockname(sock, (struct sockaddr *)&server, &length) < 0) {
perror("getting socket name");
exit(1);
}
printf("socket port #%d\n", ntohs(server.sin_port));
/* 开始接收连接 */
listen(sock, 5);
len = sizeof(struct sockaddr);
do {
msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);
if (msgsock == -1)
perror("accept");
else do{
memset(buf, 0, sizeof(buf));
if ((rval = recv(msgsock, buf, 1024,0)) < 0)
{
perror("reading stream message");
int k = GetLastError();
}
if (rval == 0)
printf("ending connection \n");
else
printf("-->%s\n", buf);
}while (rval != 0);
closesocket(msgsock);
} while (TRUE);
/* 因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。*/
exit(0);
}

[解决办法]
程序注释很清楚了,如果是c语法不熟,建议学学c程序,如果是对网络通信不了解,参考
http://www.west263.com/info/html/caozuoxitong/FreeBSD/20090513/132044.html

热点排行