您的位置:首页 > 理论基础 > 计算机网络

网络编程复习_ Exp2

2015-08-13 13:18 519 查看
1.工程文件需链接套接字动态链接库,我用的是WS2_32.dll;也可以静态链接,但应该增加了编译代价。

2.源代码

【Server】

[general_main.cpp]

#include <winsock2.h>

#include <stdio.h>

void main(void)

{
//Standard WinSock Program Procedures
WSADATA wsad; //WinSock Lib Detailed Info Struct 
SOCKET ListeningSock; 
SOCKET NewConnection; 
SOCKADDR_IN ServerAddr; 
SOCKADDR_IN ClientAddr;
int Port = 5150;

WSAStartup(MAKEWORD(2, 2), &wsad);//Parameter: 1.WinSock Lib Version 2.WinSock Lib Detailed Info Struct 

//Create A New Socket To Listen To Clients
ListeningSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); //WinSock Program Will Be Bound To Default IP Of This Computer
//char test_ip[] = "192.168.1.4"; //So  Why Can Not I Arrange To My Inner IP Artificially??
//u_long t_ip = inet_addr(test_ip);
//ServerAddr.sin_addr.s_addr = htonl(t_ip);

bind(ListeningSock, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)); //Combine A Socket Object And Address Struct

printf("Listening to any clients\n");
listen(ListeningSock, 5);

NewConnection = accept(ListeningSock, (SOCKADDR *)&ClientAddr, NULL);
printf("A client comes\n");
//Print Connected Client Info
char* client_ip = inet_ntoa(ClientAddr.sin_addr);
printf("Client Addr:  %s\n", client_ip);
printf("Client IP Family:  %ld\n", ClientAddr.sin_family);
printf("Client Port:  %ld\n", ClientAddr.sin_port);
printf("Connection Socket:  %ld\n", NewConnection);

//Data Sending Exp

char* buffer = "Welcome";

send(NewConnection, buffer, 7, 0);

//Close Connections
closesocket(NewConnection);
closesocket(ListeningSock);
WSACleanup();

}

【Client】

[general_main.cpp]

#include <winsock2.h>

#include <stdio.h>

//#pragma comment(lib,"ws2_32.lib") //import static linked lib

void client_action1(WSADATA* wsad, SOCKET* s, SOCKADDR_IN* saddr, int port);

void client_action2(WSADATA* wsad, SOCKET* s, SOCKADDR_IN* saddr, int port);

void main(void)

{
WSADATA wsad;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 5150;

client_action1(&wsad, &s, &ServerAddr, Port);

}

[client_exp1.cpp]

#include <winsock2.h>

#include <stdio.h>

void client_action1(WSADATA* wsad, SOCKET* s, SOCKADDR_IN* saddr, int port)

{
WSAStartup(MAKEWORD(2, 2), wsad);
*s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saddr->sin_family = AF_INET;
saddr->sin_port = htons(port);
saddr->sin_addr.s_addr = inet_addr("192.168.1.4");

int ret = connect(*s, (SOCKADDR *)saddr, sizeof(*saddr));
printf("result number : %d  \n", ret);

//Data Receiving Exp

char buffer[20] = "";

int recv_res = recv(*s, buffer,10,0);

printf("Data Received: %s\n", buffer);

//Close Connection
closesocket(*s);
WSACleanup();

};

3.发现问题,虽然连接成功而且也成功发送和接收了数据,但server中打印client的信息始终如图



且其中52428好像是某个数字超限后的固定输出。客户端的地址看起来也不正确。

4.上面的问题已解决,在Server程序中,使用accept函数时,第三个参数用来给客户端地址信息结构体预留空间,我把它设置为了NULL,所以这一块是空的。

        NewConnection = accept(ListeningSock, (SOCKADDR *)&ClientAddr, NULL);

      改为

        int n = sizeof(ClientAddr);

        NewConnection = accept(ListeningSock, (SOCKADDR *)&ClientAddr, &n);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: