#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
#include
int main()
{
WSADATA wsadata;
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != NO_ERROR)
{
printf("WSAStartup() 无法初始化!\n");
return -1;
}
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET)
{
printf("socket() 出错!\n");
WSACleanup();
return -1;
}
struct sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_port = htons(27105);
//unsigned long inet_addr(const char* cp)
//该函数将点分法IP地址字符串转换为in_addr结构体中的IP地址格式
//参数cp表示点分法IP地址字符串
//该函数调用成功返回unsigned long类型的网络字节顺序格式IP地址
//如果cp不是有效的IP地址字符串,该函数返回INADDR_NONE
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
//connect() 函数用于建立到Socket的连接,该Socket必须处于监听状态
//参数 s:一个未连接的Socket句柄
//参数 name:指定要建立连接的Socket的名称
//参数 namelen:指定Socket名的长度
//该函数调用成功后,返回0;否则返回SOCKET_ERROR
if (connect(ConnectSocket, (sockaddr*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
printf("connect() 出错!\n");
WSACleanup();
return -1;
}
int byteSent;
int byteRecv = SOCKET_ERROR;
char sendbuf[32] = "Client: Sending data.";
char recvbuf[32] = "";
//send() 函数可以在已连接的Socket上发送数据
//参数 s:已连接的Socket 参数 buf:包含要发送数据的缓冲区
//参数 len:buf缓冲区的长度,单位为字节 参数 flags:用于影响函数的行为,0,MSG_DONTROUTE,MSG_OOB
//函数调用成功,则返回发送数据的字节数,可能小于参数len指定的数据长度;如果出错,返回SOCKET_ERROR
byteSent = send(ConnectSocket, sendbuf, strlen(sendbuf), 0);
printf("Bytes Sent: %d\n", byteSent);
while (byteRecv != SOCKET_ERROR)
{
//recv() 函数可以从已连接的Socket中接受数据
//参数 s:已连接的Socket 参数 buf:用于接受数据的缓冲区
//参数 len:buf缓冲区的长度,单位为字节 参数 flags:用于影响函数的行为,MSG_PEEK,MSG_OOB
//函数调用成功,则返回接收数据的字节数;如果连接关闭,返回0;否则返回SOCKET_ERROR
byteRecv = recv(ConnectSocket, recvbuf, 32, 0);
if (byteRecv == 0 || byteRecv == WSAECONNRESET)
{
printf("Connection Closed!\n");
break;
}
printf("Bytes Recv: %d\n", byteRecv);
}
//closesocket() 函数用于关闭一个Socket,释放其占用的资源
//参数s表示要关闭的Socket,如果没有发生错误函数返回0,否则返回SOCKET_ERROR
//关闭Socket,如果再引用该Socket将会发生WSAENOTSOCK错误
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
/*
#define ERROR_SUCCESS 0L
#define NO_ERROR 0L
#define MSG_OOB 0x1 // process out-of-band data
#define MSG_PEEK 0x2 //peek at incoming message
#define INADDR_ANY (ULONG)0x00000000
#define INADDR_LOOPBACK 0x7f000001
#define INADDR_BROADCAST (ULONG)0xffffffff
#define INADDR_NONE 0xffffffff
*/