网络编程vc++、socket机制

今天面试的时候被问了一个socket的问题,之前做过,但因为没有总结,只是大概的讲了一下,下面把socket的流程写下:

  • udp socket

客户端:

  1. 创建udp socket
  2. 向服务器端发送数据

服务器端:

  1. 创建udpsocket
  2. 绑定到本地ip和端口
  3. 建立监听

tcp socket

客户端:

  1. 创建tcp socket
  2. 向服务器端发送连接请求
  3. 想服务器端发送数据

服务器端:

  1. 创建tcp socket
  2. 绑定到本地ip和端口
  3. 建立监听
  4. 接受连接
  • 代码实现如下:

udp服务器端

#include <Winsock2.h>
#include <stdio.h>

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 sockSrv=socket(AF_INET,SOCK_DGRAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 char recvBuf[100];
 char sendBuf[100];
 char tempBuf[200];

 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);

 while(1)
 {
  recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
  if('q'==recvBuf[0])
  {
   sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
   printf("Chat end!\n");
   break;
  }
  sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);
  printf("%s\n",tempBuf);
  printf("Please input data:\n");
  gets(sendBuf);
  sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
 }
 closesocket(sockSrv);
 WSACleanup();
}

udp客户端:

#include <Winsock2.h>
#include <stdio.h>

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 sockClient=socket(AF_INET,SOCK_DGRAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 char recvBuf[100];
 char sendBuf[100];
 char tempBuf[200];

 int len=sizeof(SOCKADDR);

 while(1)
 {
  printf("Please input data:\n");
  gets(sendBuf);
  sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,
   (SOCKADDR*)&addrSrv,len);
  recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
  if('q'==recvBuf[0])
  {
   sendto(sockClient,"q",strlen("q")+1,0,
    (SOCKADDR*)&addrSrv,len);
   printf("Chat end!\n");
   break;
  }
  sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
  printf("%s\n",tempBuf);

 }
 closesocket(sockClient);
 WSACleanup();
}

tcp服务器端:

#include <Winsock2.h>
#include <stdio.h>

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 sockSrv=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 listen(sockSrv,5);

 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);

 while(1)
 {
  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  char sendBuf[100];
  sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
   inet_ntoa(addrClient.sin_addr));
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);
  char recvBuf[100];
  recv(sockConn,recvBuf,100,0);
  printf("%s\n",recvBuf);
  closesocket(sockConn);
 }
}

tcp客户端:

#include <Winsock2.h>
#include <stdio.h>

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 sockClient=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 char recvBuf[100];
 recv(sockClient,recvBuf,100,0);
 printf("%s\n",recvBuf);
 send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

 closesocket(sockClient);
 WSACleanup();
}

udp服务器端:

#include <Winsock2.h>
#include <stdio.h>

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 sockSrv=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);
 char recvBuf[100];

 recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
 printf("%s\n",recvBuf);
 closesocket(sockSrv);
 WSACleanup();
}

udp客户端:

#include <Winsock2.h>
#include <stdio.h>

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 sockClient=socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);

 sendto(sockClient,"Hello",strlen("Hello")+1,0,
  (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
 closesocket(sockClient);
 WSACleanup();
}

创建支持多路连接的socket,tcp udp不存在多路连接的概念吧? 这个周末实现它

posted @ 2011-07-15 00:28  wanglc_work  Views(1519)  Comments(0Edit  收藏  举报