Linux网络编程

看网络编程的时候,开始感觉挺难,函数太多了,慢慢,学的多了,入门了,我把经验分享一下

 

客户端的我就不讲了,我主要讲讲服务器端的

服务器端

首先调用socket创建一个套接字。

然后通过bind绑定。

         socket只是创建了一个套接字,这个套接字将工作在哪个端口上,程序并没有固定。但服务器端的IP地址端口号一般是固定的,因此在服务器端的程序中,使用bind函数将一个套接字和某个端口绑定在一起,该函数一般只有服务器端的程序可以使用。

接着linsten监听。

            由函数socket创建的套接字是主动套接字,这种套接字可以用来主动请求连接到某个服务器(通过connect)但作为服务器端的程序,通常在某个端口上监听等待来自客户端的连接请求。
      之后调用accept就成功了

(附上服务器端代码)

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

int main()
{
	int st = socket(AF_INET,SOCK_STREAM,0);	//初始化socket 
	
	int on = 1;
	if(setsockopt(st,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) == -1)
	{
		printf("setsocopt failed %s\n",strerror(errno));
		return 0;
	}
	
	struct sockaddr_in addr;	//定义一个IP地址结构
	memset(&addr,0,sizeof(addr));
	
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8080);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);	//INADDR_ANY代表server上所有地址
	//将IP和server程序绑定 
	if(bind(st,(struct sockaddr *)&addr,sizeof(addr)) == -1)
	{
		printf("bin failed %s\n",strerror(errno));
		return 0;
	}
	//server端开始listen。
	if(listen(st,20) == -1)
	{
		printf("listen failed %s\n",strerror(errno));
		return 0;
	}
	
	char s[1024];
	int client_st = 0;		//client端socket 
	socklen_t len = 0;
	struct sockaddr_in client_addr; 	//client端IP地址 
	void *p = &client_addr;
	int i;
	for(i = 0;i < 5;i++)
	{
		memset(&client_addr,0,sizeof(client_addr));
		socklen_t len = sizeof(client_addr);
		//accept会阻塞,直到有客户端连接过来,accept返回client的socket描述符 
		client_st = accept(st,(struct sockaddr *)&client_addr,&len);
		if(client_st == -1)
		{
			printf("accept error,%s\n",strerror(errno));
			return 0;
		}
		memset(s,0,sizeof(s));
		if(recv(client_st,s,sizeof(s),0) == -1)	//阻塞的 
		{
			printf("recv falied %s\n",strerror(errno));
			close(client_st);
			return 0;
		}
		printf("revc is %s\n",s);
		close(client_st);
	}
	return 0;
} 

注意,上面的第一个socket绑定了之后就不要动了。 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值