Linux——网络编程

socket网络编程步骤

在这里插入图片描述
server端
1.socket创建套接字
2.bind为套接字写入信息(IP地址和端口号)
3.listen监听网络
4.监听到客户端连接时,接受一个连接
5.数据交互
6.关闭套接字断开连接
client端
1.socket
2.connect连接
3.数据交互
4.关闭

API

1.创建套接字
原型

#include <sys/types.h>          
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

在这里插入图片描述
2.bind
原型

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);               

用于绑定ip地址与端口号给socket
参数sockfd为socket的描述符
addr 为socketaddr类型的结构体
第三参数为结构体长度
在这里插入图片描述

3.listen函数
在这里插入图片描述
4.aceept
在这里插入图片描述
5.客户端连接函数connect
在这里插入图片描述
例程
客户端通过IP地址与端口号建立连接后,服务端每隔一段时间发送心跳包,对应客户端可以收发信息给服务器。
server.c

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
int main(int argc,char **argv)
{
		int s_fd;
		int c_fd;
		int n_read;
		char readbuf[128];
		int mark=0;
		//char *msg="ok i got it for server";
		char msg[128]={0};
        struct sockaddr_in s_addr;

        struct sockaddr_in c_addr;		
		memset(&s_addr,0,sizeof(struct sockaddr_in));
		memset(&c_addr,0,sizeof(struct sockaddr_in));

		//int socket(int domain, int type, int protocol);
		s_fd=socket(AF_INET,SOCK_STREAM,0);//1.ipv4 2.TCP协议 
		if(s_fd==-1)
		{
		perror("socket:");
		exit(-1);
		}
      //socket获取套接字


		//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
		s_addr.sin_family=AF_INET;
		s_addr.sin_port=htons(atoi(argv[2]));//端口号,一般5000~8000 调用htons字节序转换api
	    //inet_aton//将asck码转换为网络字符
		inet_aton(argv[1],&s_addr.sin_addr);
		bind(s_fd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in));
		//bind

        listen(s_fd,10);//2.连接数
		//listen

		int clen=sizeof(struct sockaddr_in);
		while(1)
		{
				mark++;
	     	c_fd=accept(s_fd,(struct sockaddr*)&c_addr,&clen);
	     	if(c_fd==-1)
     		{
		    perror("axept");
	     	exit(-1);
	     	}
		    printf("ok\n");
	     	printf("get connet:%s \n",inet_ntoa(c_addr.sin_addr));
		
	      	//accept
			if(fork()==0)
		    {
              if(fork()==0)
			  {
					  while(1){
			//  memset(msg,0,sizeof(msg));
			 // printf("input:\n");
			 // gets(msg);
			sprintf(msg,"form %d qqq",mark);
	        write(c_fd,msg,strlen(msg));
			sleep(2);	
			   }
			  } 
			while(1){  
			memset(readbuf,0,sizeof(readbuf));		
            n_read=read(c_fd,readbuf,128);
	        if(n_read==-1)
	        {
	        perror("read failed");
	        }else
	        {
	        printf("get mseeage:%d,%s form %d\n",n_read,readbuf,mark);
	        }
	    	
			}
			}
	    }
			
	    	//read
	    	//write
       


		return 0;
}

client.c

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
int main(int argc,char **argv)
{
		int c_fd;
		int n_read;
		char readbuf[128];
		//char *msg="msg from client";
        char msg[128]={0};
        struct sockaddr_in c_addr;		
		memset(&c_addr,0,sizeof(struct sockaddr_in));

		//int socket(int domain, int type, int protocol);
		c_fd=socket(AF_INET,SOCK_STREAM,0);//1.ipv4 2.TCP协议 
		if(c_fd==-1)
		{
		perror("socket:");
		exit(-1);
		}
      //socket获取套接字


		//int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
		c_addr.sin_family=AF_INET;
		c_addr.sin_port=htons(atoi(argv[2]));//端口号,一般5000~8000 调用htons字节序转换api
	    //inet_aton//将asck码转换为网络字符
		inet_aton(argv[1],&c_addr.sin_addr);
	
		//int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
        if(connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr_in))==-1)
		{
		perror("connect");
		exit(-1);
		}
		
		
				if(fork()==0)
				{
				while(1){
				memset(msg,0,sizeof(msg));
				printf("input :\n");
				gets(msg);
	         	write(c_fd,msg,strlen(msg));
				}
			 }
				while(1){
			memset(readbuf,0,sizeof(readbuf));
       		n_read=read(c_fd,readbuf,128);
	  		if(n_read==-1)
	   	    {
	  		 perror("read failed");
	  		 }else
	  		 {
	  		 printf("get mseeage from server:%d,%s\n",n_read,readbuf);
	  		 }
		 }
		
		//write
		//read



		return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值