网络编程复习_ Exp2

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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值