简单的Socket通信客户端和服务端

客户端代码

/*
*  this is client
*  write by newsyoung at 2013/9/7
*/


#include <stdio.h>
#include <WinSock2.h>
#pragma  comment(lib,"Ws2_32")
#define SERVER_IP "172.31.26.42"
#define SERVER_PORT 6100
#define BUFFER_SIZE 1024


int main(int argc, char *argv[])
{
//加载套接字WSAStartup()
WORD wVertionRequested;
WSADATA wsaData;
int res;
wVertionRequested = MAKEWORD(2,2); //设置socket 版本为2.2版


res = WSAStartup(wVertionRequested,&wsaData);
if(res!=0)
{
printf("load socket library failed!\n");
return 0;
}else{
printf("load socket library successed\n");
}


//如果不是使用V2.2版本将终止使用
if( LOBYTE (wsaData.wVersion) !=2 || HIBYTE (wsaData.wVersion) != 2)
{
WSACleanup();
return 0;
}else{
printf("Windows socket library is ws2_32\n");
}
 
 //创建客户端套接字
 SOCKET clientSocket;
 //初始化套接字
 //socket(int af,int type,int protocol)
 //af指的是通信发送的区域,type指的连接的类型,比如是面向连接的和无连接的,protocol指定连接的协议
 clientSocket = socket(AF_INET,SOCK_STREAM,6);   //在网际网中使用TCP连接方式
 if(clientSocket == INVALID_SOCKET)
 {
 printf("create socket failed \n");
 return 0;
 }else{
 printf("create socket is successed\n");
 }


 //与服务端建立连接
 int connectResult; //连接成功还是失败
 //设置客户端连接服务器端的IP地址,和端口 通过SOCKADDR_IN机构体来完成
 SOCKADDR_IN addrSever;
 addrSever.sin_family = AF_INET; //必须使用网际网的地址族
 addrSever.sin_port = htons(SERVER_PORT);
 addrSever.sin_addr.S_un.S_addr = inet_addr(SERVER_IP); //设置IP地址 采用点分十进制的方式
 //connect()的三个参数,分别表示:客户端的socket,服务器的地址,地址长度
 connectResult = connect(clientSocket,(SOCKADDR *)&addrSever,sizeof(SOCKADDR));


 if(connectResult != 0)
 {  
 printf("connectResult is %d\n",connectResult);
 printf("connect server:%s is failed\n",SERVER_IP);
 system("pause");
 return 0;
 }else{


 printf("connect %s is successed\n",SERVER_IP);
 }


 //向服务器端发送消息,通过send()
 int sendResult; //send()函数的返回值
 // char sendBuf[BUFFER_SIZE];
 // memset(sendBuf,0,BUFFER_SIZE); //对sendBuf用0进行初始化
 // strcpy((char *)sendBuf,"I am client");
 sendResult = send(clientSocket,/*(char *)sendBuf*/"I am client",BUFFER_SIZE,0);
 if(sendResult == SOCKET_ERROR)
 {
 printf("send message is failed\n");
 return 0;
 }


 // }else{
 // printf("send:%s\n",sendBuf);
 // }


 //接收服务发来的消息,通过recv()
 int recvResult = 0; //recv()返回的结果
 char recvBuf[BUFFER_SIZE];
 memset(recvBuf,0,BUFFER_SIZE);


 recvResult = recv(clientSocket,(char *)recvBuf,BUFFER_SIZE,0);


 if(recvResult == SOCKET_ERROR)
 {


 printf("receive message is failed\n");
 }else{
 printf("receive  message from server is :%s",recvBuf); //打印接收到字符串
 printf("\n");
 system("pause");
 }


 //关闭连接
 closesocket(clientSocket);







WSACleanup();


return 0;
}

服务端代码:

/*
* this is server
* write by newsyoung at 2013/9/7
*/


#include <stdio.h>
#include <WinSock2.h>


#pragma  comment(lib,"Ws2_32")
#define  SERVER_PORT 6100
#define  BUFFER_SZIE 1024
int main(int argc,char *argv[])
{
//加载socket库
WORD wVersionRequested;
WSADATA wsaData;
int res;
wVersionRequested = MAKEWORD(2,2); //设置Ws2_32库的版本为2.2
res = WSAStartup(wVersionRequested,&wsaData); //加载Ws2_32socket库
if(res != 0)
{
printf("load socket library is failed\n");
return 0;
}


//判断加载的socket库是否为2.2版本,如果不是将不可用
if (LOBYTE (wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
return 0;


}


//创建服务器端套接字
SOCKET socketServer;
//初始化套接字
socketServer = socket(AF_INET,SOCK_STREAM,6);
if(socketServer == INVALID_SOCKET)
{
printf("create server socket is failed\n");
return 0;


}


//连接向服务器发出连接请求的客户端
int bindResult; //接收bind()的连接结果
SOCKADDR_IN addrServ;


addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(SERVER_PORT);
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //响应任何IP的连接请求
bindResult = bind(socketServer,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
if(bindResult == SOCKET_ERROR)
{
printf("bind is failed \n");
system("PAUSE");
return 0;
}


//监听客户端
int listenResult = 0; //监听结果
listenResult = listen(socketServer,5); //最多响应5个连接请求
if(listenResult == SOCKET_ERROR )
{


printf("server listen is failed\n");
return 0;
}
//接收客户端发来的消息
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
SOCKET sockConnection;
sockConnection = accept(socketServer,(SOCKADDR *)&addrClient,&len);
if(sockConnection == INVALID_SOCKET)
{
printf("server accept is failed\n");
}
int recvResult = 0; //接收消息结果
char recvBuf[BUFFER_SZIE];
memset(recvBuf,0,BUFFER_SZIE);


recvResult = recv(sockConnection,(char *)recvBuf,BUFFER_SZIE,0);
if(recvResult == SOCKET_ERROR)
{
printf("receive client message is failed\n");
return 0;
}else{
//打印接收到的客户信息
  in_addr clientIP; //保存连接的客户端IP
memcpy(&clientIP,&(addrClient.sin_addr.S_un.S_addr),sizeof(addrClient.sin_addr.S_un.S_addr));
printf("client ip is :%s\n",inet_ntoa(clientIP)); //inet_ntoa将ip地址转换为字符串
printf("receive  message from client is :%s",recvBuf);


}


//发送消息给客户端
int sendResult = 0; //发送结果
sendResult = send(sockConnection,"I am server",BUFFER_SZIE,0);
if(sendResult == SOCKET_ERROR)
{
printf("server send message is failed\n");
return 0;
}


closesocket(sockConnection); //关闭连接
}



closesocket(socketServer);
WSACleanup();
return 0;


}

以下是C# Socket通信客户端服务端的例子: 服务端: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class Server { public static void Main() { byte[] bytes = new byte[1024]; IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { listener.Bind(localEndPoint); listener.Listen(10); while (true) { Console.WriteLine("Waiting for a connection..."); Socket handler = listener.Accept(); string data = null; while (true) { bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.ASCII.GetString(bytes, 0, bytesRec); if (data.IndexOf("<EOF>") > -1) { break; } } Console.WriteLine("Text received : {0}", data); byte[] msg = Encoding.ASCII.GetBytes(data); handler.Send(msg); handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.WriteLine("\nPress ENTER to continue..."); Console.Read(); } } ``` 客户端: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; public class Client { public static void Main() { byte[] bytes = new byte[1024]; try { IPHostEntry ipHostInfo = Dns.GetHostEntry("localhost"); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000); Socket sender = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { sender.Connect(remoteEP); Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString()); byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>"); int bytesSent = sender.Send(msg); int bytesRec = sender.Receive(bytes); Console.WriteLine("Echoed test = {0}", Encoding.ASCII.GetString(bytes, 0, bytesRec)); sender.Shutdown(SocketShutdown.Both); sender.Close(); } catch (ArgumentNullException ane) { Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); } catch (SocketException se) { Console.WriteLine("SocketException : {0}", se.ToString()); } catch (Exception e) { Console.WriteLine("Unexpected exception : {0}", e.ToString()); } } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.WriteLine("\nPress ENTER to continue..."); Console.Read(); } } ``` 这里的例子中,服务端监听本机IP地址和端口11000的连接请求,客户端连接服务端并向服务端发送数据,服务端收到数据并将其原样返回给客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值