socket网络编程的初学使用见解

所谓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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值