看网络编程的时候,开始感觉挺难,函数太多了,慢慢,学的多了,入门了,我把经验分享一下
客户端的我就不讲了,我主要讲讲服务器端的
服务器端
首先调用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绑定了之后就不要动了。