一、Winsocket用TCP协议来完成通信
①服务器的程序
// SocketSever.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"WS2_32.LIB")
#if DUBUG
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
#define SOCK_STREAM 1 /* stream socket */
#define SOCK_DGRAM 2 /* datagram socket */
#define SOCK_RAW 3 /* raw-protocol interface */
#define SOCK_RDM 4 /* reliably-delivered message */
#define SOCK_SEQPACKET 5 /* sequenced packet stream */
/*
* Socket address, internet style.
*/
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
typedef struct sockaddr_in SOCKADDR_IN; /* Microsoft Windows Extended data types */
int bind(
SOCKET s,
const struct sockaddr FAR * name,
int namelen
); /* INCL_WINSOCK_API_PROTOTYPES*/
int listen(
SOCKET s,
int backlog
);
#endif
#define Port 3578
#define MaxSize 1024
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
SOCKET sockSrv; //服务器
SOCKET sockConn;
//********************************************************************************************************/
//** 函数名 ** StartSock()
//** 输入 ** 无
//** 输出 ** 无
//**函数描述** 加载套接字
//********************************************************************************************************/
int SocketInit()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData); //返回0,成功,否则就是错误码
if (err!=0)
{
printf("WinSock DLL版本不足要求n");
return 0;
}
if (LOBYTE(wsaData.wVersion)!=2||
HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return 0;
}
return 1;
}
//********************************************************************************************************/
//** 函数名 ** main()
//** 输入 ** 无
//** 输出 ** 无
//**函数描述** 主函数
//********************************************************************************************************/
int main()
{
if (SOCKET_ERROR ==SocketInit())
{
return -1;
}
SOCKADDR_IN addrSrv;//存放本地地址信息的
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//htol将主机字节序long型转换为网络字节序
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6001);//htos用来将端口转换成字符,1024以上的数字即可
//真正socket编程部分
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//面向连接的可靠性服务SOCK_STRAM
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将socket绑定到相应地址和端口上
listen(sockSrv,5);//等待队列中的最大长度为5
printf("%s\n","Welcome,the Host is running!Now Wating for someone comes in!");
SOCKADDR_IN addrClient;
int iSend = 0;
char sendBuf[MaxSize];
char revBuf[MaxSize];
int len=sizeof(SOCKADDR);
while(1) //循环监听客户端,永远不停止
{
sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//阻塞调用进程直至新的连接出现
if(sockConn == INVALID_SOCKET)
{
printf("Accept Failed!\n");
return -1;
}
sprintf(sendBuf,"Server IP is:%s",inet_ntoa(addrClient.sin_addr));//inet_nota函数是将字符转换成ip地址
iSend = send(sockConn,sendBuf,strlen(sendBuf)+1,0);//服务器向客户端发送数据
if(iSend == SOCKET_ERROR)
{
printf("send Failed!");
break;
}
char recvBuf[100];
recv(sockConn,recvBuf,100,0);//服务器从客户端接受数据
printf("%s\n",recvBuf);
closesocket(sockConn);//关闭socket
}
closesocket(sockConn); //关闭套接字
getchar();
return 0;
}
②客户端的程序
<pre name="code" class="cpp">#include "stdafx.h"
#include <Winsock2.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"WS2_32.LIB")
//********************************************************************************************************/
//** 函数名 ** StartSock()
//** 输入 ** 无
//** 输出 ** 无
//**函数描述** 加载套接字
//********************************************************************************************************/
int SocketInit()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData); //返回0,成功,否则就是错误码
if (err!=0)
{
printf("WinSock DLL版本不足要求n");
return 0;
}
if (LOBYTE(wsaData.wVersion)!=2||
HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return 0;
}
return 1;
}
//********************************************************************************************************/
//** 函数名 ** main()
//** 输入 ** 无
//** 输出 ** 无
//**函数描述** 主函数
//********************************************************************************************************/
int main()
{
//固定格式
char recvBuf[1024];
if (SOCKET_ERROR ==SocketInit())
{
return -1;
}
//建立通讯socket
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.100");//设定需要连接的服务器的ip地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6001);//设定需要连接的服务器的端口地址
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//与服务器进行连接
//接受来自老师的信息
int iRevLen = 0;
iRevLen = recv(sockClient,recvBuf,strlen(recvBuf)+1,0);
if(0 == iRevLen)
{
return -1;
}
else if(SOCKET_ERROR == iRevLen)
{
printf("Recv Failed\n!");
return -1;
}
printf("%s\n",recvBuf);
char str[100];
gets(str);
send(sockClient,str,strlen(str)+1,0);
closesocket(sockClient);
WSACleanup();
getchar();
return -1;
}原文:http://blog.csdn.net/xy010902100449/article/details/44754511