有了上一篇文章详细讲解如何使用Winsock实现网络通信——服务器端对服务器端的积累,实现客户端就很容易了,客户端和服务器端唯一的不同就是在调用socket函数建立套接字后不需要调用bind函数绑定地址,而是调用connect函数直接连接服务器。connect函数原型:
int connect(SOCKET s,const struct sockaddr FAR *name,int namelen);
s是套接字句柄
name指向sockaddr结构体指针,包含我们要连接的服务器端的地址信息。
namelen参数指向sockaddr结构的长度,可以用sizeof函数获得。
函数成功调用返回0,失败返回SOCKET_ERROR
具体的实现代码:
#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
int main(int argc, char* argv[])
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
//加载winsock库
if(WSAStartup(sockVersion, &wsaData) != 0)
return 0;
// 创建套节字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sClient == INVALID_SOCKET)
{
printf("socket error\n");
return 0;
}
// 在sockaddr_in结构中装入服务器端地址信息
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(4500);// htons函数 将主机的无符号短整形数转换成网络
//字节顺序,4500端口为要连接服务器端的端口
servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip
//连接服务器端
if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
{
printf("connect error\n");
closesocket(sClient);
return 0;
}
char *buff="\r\nzy_dreamer client coming...\r\n";
//发送数据
send(sClient,buff,strlen(buff),0);
char revData[255];
//直到收到有效数据时才打印出来
int ret=recv(sClient,revData,255,0);
if(ret>0)
{
//为了防止打印出错,把字符串结尾设成0x00
revData[ret]=0x00;
printf(revData);
}
closesocket(sClient);
WSACleanup();
return 0;
}