所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
SOCKET连接过程
客户端请求:是指由
客户端的
套接字提出连接请求,要连接的目标是
服务器端的套接字。为此,
客户端的
套接字必须首先描述它要连接的
服务器的套接字,指出
服务器端套接字的
地址和
端口号,然后就向
服务器端套接字提出连接请求。
连接确认:是指当
服务器端
套接字监听到或者说接收到
客户端套接字的连接请求,它就响应
客户端套接字的请求,建立一个新的线程,把
服务器端套接字的描述发给
客户端,一旦客户端确认了此描述,连接就建立好了。而
服务器端
套接字继续处于
监听状态,继续接收其他
客户端套接字的连接请求。
以下代码是实现socket客户端,希望对初学者有可以借鉴的地方,不足的地方还请加以指正,互相学习。
#include <WINSOCK2.h>
#include <stdio.h>
#inlcude <Windows.h>
//ip与端口
#define SERVER_ADDRESS "127.0.0.1"
#define PORT
10086
#define MAXSIZE
32
//加入静态库
#pragma comment(lib,"ws2_32.lib")
/*发送消息给服务端线程*/
DWORD WINAPI MySendThread(LPVOID pvaram)
{
SOCKET sendClient = (SOCKET)(LPVOID)
pvaram;
char buffin[MAXSIZE]; /*收发缓冲器*/
while(TRUE)
{
Sleep(100);
printf("Send:");
//从键盘输入要发送的内容
gets(buffin);
//发送数据到套接字
send(sendClient,buffin,strlen(buffin),0);
}
//关闭套接字
closesocket(sendClient);
}
/*主函数*/
int main()
{
//定义一个存储socket信息结构体
WSADATA wsaData;
/定义一个套接字
SOCKET sClient;
//sockaddr结构
SOCKADDR_IN server;
int syn_ack;
//应答信号
int iRet = WSAStartup(MAKEWORD(2,2),&
wsaData);
if(iRet!=NOERROR)
printf("ERROR at WSAStartuo()\n");
//创建socket
tcp/ip
sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//指定要连接的ip/port
memset(&server,0,sizeof(SOCKADDR_IN));
server.sin_family = AF_INET;
server.sin_port = htons(POT);
server.sin_addr.s_addr = inet_addr(
SERVER_ADDRESS );
//发送连接请求
connect(sClient,(struct sockaddr*)&server,sizeof(
SOCKADDR_IN ));
//创建线程 (发送消息的)
HANDLE hThread = CreateThread(NULL,0,MySendThread,(LPVOID)sClient,0,NULL);
while(TRUE)
{
syn_ack = SOCKET_ERROR;
char buffout[MAXSIZE];
memset(buffout,0,sizeof(buffout));
whlie(syn_ack ==
SOCKET_ERROR)
{
//接收
syn_ack = recv(sCilent,buffout,sizeof(buffout),0);
}
printf("Recived:%s\n",buffout);
}
//释放连接和结束工作
closesocket(sClient);
CloseHandle(hThread);
WSACleanup();
return 0;
}