给予SOCKET套接字的网络编程总结

基于DOS平台下SOCKET编程

首先创建服务器端程序

void main()

{

     //首先加载套接字库,我这里用的是1.1版本,有兴趣的可以联2.0库,可以获得更多功能啊

WORD wVersionRequested;
WSADATA wsaData;
int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
           return false;
}
 
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
    WSACleanup( );
    return false;
}

//创建套接字,在这之前,还要加两个头文件和一个库文件,分别是

#include <Winsock2.h>

#include <stdio.h>

库文件要在设置.工程里面的连接选项中加入Use Ws2_32.lib

SOCKET s=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN sockAddr;
 sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
 sockAddr.sin_family = AF_INET;
 sockAddr.sin_port = htons(5000);//这里的端口可以随便设置,但必须和客户端的一致

//绑定套接字

bind(s,(sockaddr*)&sockAddr,sizeof(sockaddr));
    char recvBuff[100];
 char sendBuff[100];
 char tempBuff[100];
 SOCKADDR_IN sockFrom;
 int len = sizeof(sockaddr);
    while(true)
 {
  ::recvfrom(s,recvBuff,100,0,(sockaddr*)&sockFrom,&len);
  if('q' == recvBuff[0])
  {
   printf("Chat end!/n");
   sendto(s,"q",strlen("q")+1,0,(sockaddr*)&sockFrom,len);
   break;
  }
        sprintf(tempBuff,"%s say: %s",inet_ntoa(sockFrom.sin_addr),recvBuff);
  printf("%s/n",tempBuff);
        gets(sendBuff);
        sendto(s,sendBuff,strlen(sendBuff)+1,0,(sockaddr*)&sockFrom,len);
 }
    closesocket(s);
    WSACleanup( );

}

再来编写客户端代码

再先前的工作空间中建立一个工程UdpClient,至于加入头文件客库文件和服务器端一模一样

void main()

{

WORD wVersionRequested;
 WSADATA wsaData;
 int err;
    wVersionRequested = MAKEWORD( 1,1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
     return ;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
     WSACleanup( );
  return ;
 }

 SOCKET s = socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN sockAddr;
 sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 sockAddr.sin_family = AF_INET;
 sockAddr.sin_port = htons(5000);

 char sendBuff[100];
 char recvBuff[100];
 char tempBuff[100];
 printf("聊天通道已经完成,开始吧!/n");
    SOCKADDR_IN sockFrom;
 int len = sizeof(sockaddr);
 while(true)
 {
  gets(sendBuff);
  sendto(s,sendBuff,strlen(sendBuff)+1,0,(sockaddr*)&sockAddr,sizeof(sockaddr));
        recvfrom(s,recvBuff,100,0,(sockaddr*)&sockFrom,&len);
  if('q' == recvBuff[0])
  {
   printf("Chat End!/n");
   sendto(s,"q",strlen("q")+1,0,(sockaddr*)&sockFrom,sizeof(sockaddr));
   break;
  }
  sprintf(tempBuff,"%s say: %s",inet_ntoa(sockFrom.sin_addr),recvBuff);
  printf("%s/n",tempBuff);
 }
 closesocket(s);
    WSACleanup( );

}

这样,一个简单的聊天程序就完成了,但是它还有很多缺陷,比如说基于DOS的,客户端必须先发送数据,然后才是服务器端,交互性很差,由于它是基于UDP协议的,稳定性不是很理想,但作为初期的网络编程练习,我觉得还是恨道的,希望对你有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于网络编程中的socket,它是一种用于在网络中进行通信的编程口或抽象层。通过socket,我们可以建立客户端和服务器之间的连,并进行双向的数据传输。 在网络编程中,通常使用TCP和UDP两种协议来进行数据传输。TCP(Transmission Control Protocol)是一种可靠的、面向连的协议,它提供了稳定的数据传输和错误恢复机制。而UDP(User Datagram Protocol)是一种不可靠的、无连的协议,它更适合实时性要求较高的数据传输。 在使用socket进行网络编程时,通常需要以下步骤: 1. 创建socket:使用socket()函数创建一个新的socket对象。 2. 绑定socket:对于服务器端,需要使用bind()函数将socket绑定到一个特定的IP地址和端口号上。对于客户端,通常可以省略这一步。 3. 监听连(仅适用于服务器):对于服务器端,可以使用listen()函数开始监听传入的连请求。 4. 受连(仅适用于服务器):使用accept()函数受客户端的连请求,并返回一个新的socket对象,用于与该客户端进行通信。 5. 发送和收数据:使用send()函数发送数据,使用recv()函数收数据。 6. 关闭socket:使用close()函数关闭socket。 需要注意的是,网络编程中的socket可以是阻塞的或非阻塞的。在阻塞模式下,程序会一直等待,直到某个操作完成或超时。而在非阻塞模式下,程序会立即返回,并且可以继续执行其他操作。 这只是网络编程socket的基本概念和使用方法的简单介绍,如果你有更具体的问题,我可以帮你更详细地解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值