使用AF_INET实现点对点的通信示例

作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

1.    客户端(发送方)

操作流如下:

(1) 使用AF_INET协议簇,创建基于数据报的socket对象;

(2) 发送方不会在程序中显式的绑定自己的IP信息,但系统会帮助完成这一动作,并指定随机的端口信息,所以接收端显示的端口信息并不会每次都一样;

(3) 发送端向接收端的7838端口发送数据,然后退出

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
     struct sockaddr_in s_addr;
     int sock, addr_len, len;
     char buff[128];
     if(-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))
     {
         printf("socket");
         exit(errno);
     }
     else
         printf("create socket.
");

     s_addr.sin_family = AF_INET;
     s_addr.sin_port = htons(7838);

    if(argv[1])
	{
     	s_addr.sin_addr.s_addr = inet_addr(argv[1]);
    }
    else
    {
     	printf("input server ip!
");
        exit(0);
    }
    addr_len = sizeof(s_addr);

    strcpy(buff,"hello i am here");
    len = sendto(sock, buff, strlen(buff),
     				0, (struct sockaddr *)&s_addr, addr_len);
    if(len < 0)
	{
		printf("
 send error.
");
	    return 3;
	}
	printf("send success.

");
	
	return 0;
}


2.    服务器端(接收方)

操作流如下:

(1) 使用AF_INET协议簇,创建基于数据报的socket对象;

(2) 绑定自己的IP和端口,此端口也是发送方程序向接收端发起连接时指定的接收端端口;

(3) 接收端阻塞式接收发送端数据;

(4) 如果接收到数据,读取数据并处理。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdlib.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
	struct sockaddr_in s_addr, c_addr;
    int sock, len;
    socklen_t addr_len;
    char buff[128];
    if((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
    	printf("socket");
    	exit(errno);
    }
    else
    	printf("create socket.

");
    
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(7838);
    s_addr.sin_addr.s_addr = INADDR_ANY;
    
    if((bind(sock,(struct sockaddr *)&s_addr, sizeof(s_addr))) == -1)
    {
        printf("bind");
        exit(errno);
    }
    else
    	printf("bind address to socket.

");
    
    addr_len=sizeof(c_addr);
    while(1) {
    	len = recvfrom(sock, buff, sizeof(buff) - 1,
    			0, (struct sockaddr *)&c_addr, &addr_len);   
        if(len<0)
        {
            printf("recvfrom");
            exit(errno);
        }
    
        buff[len]='';
        printf("recive come from %s:%d message:%s

",
        	inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);
    }
    
    return 0;
}
作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

原文地址:https://www.cnblogs.com/youngerchina/p/5624560.html