Windows下C语言的Socket编程练习


服务器:

#include
#include
#include

#define MYPORT 80 
#define BACKLOG 5 
#define MAXDATASIZE 100 
  
int main()
{
	WSADATA wsaData;
    //初始化Socket库
    WSAStartup( MAKEWORD( 2, 0), &wsaData);
	int my_sock,their_sock;
	
	SOCKADDR_IN my_addr, their_addr;
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(MYPORT);
	my_addr.sin_addr.s_addr = INADDR_ANY;
	ZeroMemory( &( my_addr.sin_zero), 8);
	
	if(( my_sock = socket( AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
	{
		perror("socket"); 
        return 0;  
	}
	if( bind( my_sock, (SOCKADDR *)&my_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
	{
		perror("bind");  
        return 0; 
	}
	if( listen( my_sock, BACKLOG) == SOCKET_ERROR)
	{
		perror("listen");  
        return 0;  
	}
	
	char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE];
	
	int flag = 1; 
	
	while(1)
	{
		if(flag) printf("----------------------等待链接----------------------\n\n");
		
		flag = 0; 
		
		int sin_size = sizeof(SOCKADDR_IN);
		if(( their_sock = accept( my_sock, (SOCKADDR *)&their_addr, &sin_size)) == SOCKET_ERROR) 
		{
			perror("accept");  
            continue;  
		}
		
		printf("\n\n请输入:");
	
		ZeroMemory( sendbuf, MAXDATASIZE);
		gets(sendbuf);
		
		if(!flag) printf("\n\n\n--------------------等待对方输入--------------------\n\n");
		
		if( send( their_sock, sendbuf, sizeof(sendbuf), 0) == SOCKET_ERROR)
		{
			perror("send");  
			return 0;
		}  
            
       int numbytes = recv(their_sock, recvbuf, MAXDATASIZE, 0);

       recvbuf[numbytes] = '\0';

       printf("对方回应: %s",recvbuf); 
       closesocket(their_sock);
       
	} 
	return 0;
} 

客户端:

#include
#include
#include

#define PORT 80
#define MAXDATASIZE 100

int main()
{
    WSADATA wsaData;
    //初始化Socket库
    WSAStartup( MAKEWORD( 2, 0), &wsaData);
    int sock, numbytes;

    HOSTENT *he;
    SOCKADDR_IN their_addr;
    /*
     struct sockaddr_in {
        short int sin_family;   //Internet地址族
        unsigned short int sin_port; // 端口号
        struct in_addr sin_addr;  //Internet地址
        unsigned char sin_zero[8]; // 添0(和struct sockaddr一样大小)
    }; */
    /*
    struct in_addr {
        unsigned long s_addr;
    };
    */

    while(1)
    {

        //获取主机名
        char ServerName[128];
        gethostname( ServerName, 128);
        he = gethostbyname( ServerName);
        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(PORT);
        their_addr.sin_addr = *(( IN_ADDR *)he->h_addr);
        their_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器地址 //127.0.0.1
        ZeroMemory(&(their_addr.sin_zero), 8);


        //建立socket
        //AF_UNIX - 只在单机上使用。
        // AF_INET - 可以在单机或其他使用DARPA协议(UDP/TCP/IP)的异种机通信。
        //SOCK_STREAM - 用来建立面向连接的sockets,可以进行可靠无误的的数据传输
        // SOCK_DGRAM - 用来建立没有连接的sockets,不能保证数据传输的可靠性。
        sock = socket(AF_INET, SOCK_STREAM, 0);

        char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE];

        printf("-------------------等待服务器发送消息-------------------\n\n\n");

        //连接服务器
        if(connect(sock, (SOCKADDR *)&their_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
        {
            perror("connect");
            continue;
        }
        //接收服务器传来的消息
        numbytes = recv(sock, recvbuf, MAXDATASIZE, 0);
        if(numbytes == SOCKET_ERROR)
        {
            perror("recv");
            break;
        }
        recvbuf[numbytes] = '\0';
        printf("服务器消息: %s\n", recvbuf);
        printf("请输入:");
        ZeroMemory(sendbuf, sizeof(sendbuf));
        gets(sendbuf);
        printf("\n\n\n");

        //向服务器发送消息
        if(send(sock, sendbuf, MAXDATASIZE, 0) == SOCKET_ERROR)
        {
            perror("send");
            break;
        }
        //关闭socket
        closesocket(sock);
    }


    return 0;

}


你可能感兴趣的:(数据结构&&作业,其他)