socket --------tcp/ip

本文通过C/S模式的网络通信实例,详细解析了客户端和服务端如何通过Winsock库进行通信,包括套接字的创建、监听、接受、收发消息等关键步骤。
//server.c 

#include <Winsock.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"wsock32.lib")

#define PORT 12345
#define BUFFER 1024

int main(int argc, char* argv[])
{

 WSADATA       wsaData;
 SOCKET        server;                 
// char          buf_send[BUFFER];
 char  buf_recv[BUFFER]="hello!";
 int len;
 struct sockaddr_in  serv,client;   //声明两个地址结构体变量

// memset(buf_recv,0,sizeof(buf_recv)); 
// memset(buf_send,0,sizeof(buf_send));
 
 //加载套接字库 
 if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
 {
  printf("Winsock load failed\n");
  exit(0);
 }
 
 server = socket(AF_INET,SOCK_STREAM,0);  

 if(server == INVALID_SOCKET)
 {
  printf("socket failed:%d\n",WSAGetLastError());
  exit(0);
 }

 //创建一个套接字  AD_INET(IPV4协议)  SOCK_STREAM(TCP协议)
 serv.sin_family = AF_INET;           //协议族必须和创建套接字时候一样(socket)
 serv.sin_port = htons(PORT);        //端口  htons转换为网络字节序
 serv.sin_addr.s_addr = htonl(INADDR_ANY);  //绑定的地址  htonl转换为网络字节序
             //INADDR_ANY 默认的网卡地址为本机
 //bind 绑定地址
 if(bind(server,(SOCKADDR *)&serv,sizeof(serv))==SOCKET_ERROR)
 {
  printf("bind()failed:%d\n",WSAGetLastError());
  exit(0);
 }
 //监听客户端
 if(listen(server,5)==SOCKET_ERROR) 
 {
  printf("listen()failed:%d\n",WSAGetLastError());
  exit(0);
 }
    
 len=sizeof(client); 
 //accept阻塞 直到有新的连接
  if(accept(server,(struct sockaddr*)&client,&len) == INVALID_SOCKET)
  {
   printf("accept()failed:%d\n",WSAGetLastError());
   exit(0) ;
  }

  printf("accepted client IP:[%s]\n,port:[%d]\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));


 while(1)      
 {
   //recv读取消息
   if(recv(server,buf_recv,sizeof(buf_recv),0) == 0)
   {
    printf("recv()failed:%d\n",WSAGetLastError());
    exit(0);
   }
   printf("recv()data from client:%s\n",buf_recv);

 
   //send发送请求 
   printf("pleasse send message:\n");
   gets(buf_recv);
   if(send(server,buf_recv,sizeof(buf_recv),0) == 0)  
   {
    printf("send()failed:%d\n",WSAGetLastError());
    exit(0);
   }

  closesocket(server); //关闭套接字
  WSACleanup();   //关闭套接字库
}
}

//client.c

#include <Winsock.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#pragma comment(lib,"wsock32.lib")

#define PORT 12345
#define BUFFER 1024

void main(int argc,char *argv[])
{
 WSADATA    wsaData;
 SOCKET    client;     
 char    buf_recv[BUFFER]; 
// char buf_send[BUFFER];
 struct sockaddr_in   serv; 
// struct sockaddr_in   client;

 memset(buf_recv,0,sizeof(buf_recv)); 
// memset(buf_send,0,sizeof(buf_send));
 if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
 {
  printf("Winsock load failed\n");
  exit(0);
 }
 
 //为地址结构体赋值
 serv.sin_family=AF_INET;   //地址族
 serv.sin_port=htons(PORT);   //服务端监听的端口
 serv.sin_addr.s_addr=inet_addr("192.168.2.100");  //服务端的IP地址

 
 client=socket(AF_INET,SOCK_STREAM,0); //创建 套接字
 if(client==INVALID_SOCKET)
 {
  printf("socket failed:%d\n",WSAGetLastError());
  exit(0);
 }


 //连接服务器
 if(connect(client,(struct sockaddr*)&serv,sizeof(serv)) == INVALID_SOCKET) 
 {
  printf("connet()failed:%d\n",WSAGetLastError());
  exit(0);
 }
 printf("connect server sucessful!\n");

 while(1)
 { 
 
  //send发送请求
   printf("pleasse send message!\n");
   gets(buf_recv);
   if(send(client,buf_recv,sizeof(buf_recv),0) == 0)  
   {
    printf("send failed:%d\n",WSAGetLastError());
    exit(0);
   }
  //recv读取消息
   if(recv(client,buf_recv,sizeof(buf_recv),0) == 0)
  {
   printf("recv failed:%d\n",WSAGetLastError());
   exit(0);
  }
  printf("recv data from server:%s\n",buf_recv);
 
 
 closesocket(client); //关闭套接字
 WSACleanup();   //关闭套接字库
 }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值