Windows下C语言的Socket编程练习


服务器:

#include<stdio.h>
#include<string.h>
#include<winsock2.h>

#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<stdio.h>
#include<string.h>
#include<winsock2.h>

#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;

}


最新版Socket编程,后面带有程序实例,并通过调试,可以直接编译运行;希望对大家有帮助。代码设计服务端、客户端socket实例,设计IPV4、IPV6的实例代码。 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。 部分代码(服务器): #include #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ main() { int sockfd,client_fd; /*sockfd:监听socket;client_fd:数据传输socket */ struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero( &(my_addr.sin_zero),8); if (bind(sockfd, (struct sockaddr *) &my;_addr, sizeof(struct sockaddr)) == -1) { perror( "bind出错!"); exit(1); } if (listen(sockfd, BACKLOG) == -1) { perror( "listen出错!"); exit(1); } while(1) { sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *) &remote;_addr, &sin;_size)) == -1) { perror( "accept出错"); continue; } printf( "received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); if (!fork()) { /* 子进程代码段 */ if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) perror( "send出错!"); close(client_fd); exit(0); } close(client_fd); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值