socket编程流程(tcp)

以下是tcp编程的两段代码,一段作为服务器,一段作为客户端,只要客户端打开新的程序,服务器端就能进行接收了。两个程序为在同一台机器上运行。
服务端
// w32_1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 5050

int _tmain(int argc, _TCHAR* argv[])
{
//initialize the Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult != NO_ERROR)
{
printf("Error at WSAStartup");
return 1;
}

//Create a socket for listening for
//incoming connection requests;
SOCKET socketListen;
socketListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(socketListen == INVALID_SOCKET)
{
printf("Error at socket():%ld/n",WSAGetLastError());
WSACleanup(); //这里之所以要清理,是因为上面WSAStartup()已经调入了winsock
return 1;
}

//接下来应该绑定端口,但在此之前,先要搞一个sockaddr_in结构放端口之类的信息
//The sockaddr_in structure specifies the address family,
//IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //inet_addr
service.sin_port = htons(27015);

if(bind(socketListen, (sockaddr*)&service, sizeof(service)) == SOCKET_ERROR) 
//sockaddr 根据协议不同会不同,所以需要转换一下
{
printf("bind() failed./n");
closesocket(socketListen); //last step has created socket
WSACleanup();
return 1;
}

//绑定完成后,作为服务端接下来的工作就是监听了
//Listen for incomming connection requests.
//on the created socket
if(listen(socketListen, 1) == SOCKET_ERROR)
{
printf("listen() failed:%d",WSAGetLastError());
closesocket(socketListen);
WSACleanup();

return 1;
}

//server listen socket建立了,但是这是主socket,仅负责监听端口的功能
//要能接下来处理网络数据,我们需要再新建端口来完成
//Create a socket for accepting incoming requests.
SOCKET socketAccept;

while(1)
{

printf("waiting for client to connect.../n");

//accept the connection
socketAccept = accept(socketListen, NULL, NULL);
if(socketAccept == INVALID_SOCKET)
{
printf("accept failed:%d/n", WSAGetLastError());
closesocket(socketListen);
WSACleanup();

return 1;
}
else
{
printf("client connected/n");
}
closesocket(socketAccept); //释放本次的链接

}
//no longer need server soket
closesocket(socketListen);

WSACleanup();

return 0;
}

//客户端
#include "stdafx.h"

#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
//同样测试协议,加载模块
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if(iResult != NO_ERROR)
{
printf("Error at WSAStartup");
return 1;
}

//同样创建socket
SOCKET socketConnection;
socketConnection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(socketConnection == INVALID_SOCKET)
{
printf("Error at socket():%ld/n", WSAGetLastError());
WSACleanup(); //同样卸载模块资源

return 1;
}

//定义一个服务器地址
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015);

//接下来链接到服务器就行了
if(connect(socketConnection, (sockaddr*)&service, sizeof(service)) != 0)
{
printf("Error at connect:%ld", WSAGetLastError());
closesocket(socketConnection);
WSACleanup();

return 1;
}


return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值