1,int socket(int domain,int type,int protocol)
domain :
AF_INET ipv4
AF_UNIX 进程间通信的一种方式,命名socket特殊的,不走ip层
type:
SOCKET_DGRAM UDP报文
SOCK_STREAM TCP报文
protocol:
IPPROTO_ICMP:ping命令实现报文
IPPROTO_TCP ,IPPRO_UDP
常用 listen_fd 作为返回值
2,bind()
int bind(int sock_fd, const struct sockaddr *addr, socklen_t addrlen)
sock_fd :socket返回的文件描述符
addr :绑定的ip地址和端口信息
addrlen :addr 长度
serv_addr.sin_family = AF_STREAM
serv_addr.sin_port = htons(8889) host to net short类型 大端字节数
serv_addr.sin_addr.s_addr = htonl("xxxxxxx") long 绑定ip地址
头文件: #include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
3,listen()
int listen(int sock_fd,int backlog) backlog 有多少客户端
4,accept()
int accept(int sock_fd,struct sockaddr *addr,socklen_t *addrlen) //套路
addr 和 addrlen 一般是NULL 分别是客户端的IP和端口信息
返回的fd给客户端通信
5,connect()
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
socklen_t addrlen);
如 :connect(conn_fd,(const struct sockaddr *)&serv_addr,sizeof(serv_addr)
客户端程序:
注:
客户端
inet_aton("127.0.0.1",)
回环设备不走网络层,
服务器程序:
/*********************************************************************************
* Copyright: (C) 2018 ligang<2820724771@qq.com>
* All rights reserved.
*
* Filename: socket_server.c
* Description: This file
*
* Version: 1.0.0(03/16/2018)
* Author: ligang <2820724771@qq.com>
* ChangeLog: 1, Release initial version on "03/16/2018 10:24:16 PM"
*
********************************************************************************/
#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char **argv)
{
int sock_fd,new_fd;
struct sockaddr_in serv_addr;
char buf[1024];
sock_fd = socket(AF_INET,SOCK_STREAM,0);
if(sock_fd < 0)
{
printf("create socket is failure %s\n",strerror(errno));
return -1;
}
printf("create socket fd [%d]\n",sock_fd);
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
printf("memset\n");
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8555);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
printf("begin to bind\n");
if(bind(sock_fd,(const struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
{
printf("bind is failure %s\n ",strerror(errno));
return -2;
}
printf("begin to listen\n");
listen(sock_fd,13);
while(1)
{
printf("begin to accepting!\n");
new_fd = accept(sock_fd,NULL,NULL);
if(new_fd<0)
{
printf("accept is failure %s\n",strerror(errno));
return -2;
}
memset(buf,0,sizeof(buf));
read(new_fd,buf,sizeof(buf));
printf("read message is %s\n",buf);
write(new_fd,"welcome",7);
sleep(1);
close(new_fd);
}
close(sock_fd);
return 0;
}
客户端程序:
[ligang@MiWiFi-R3P-srv ~]$ cat my_socket_client.c
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char **argv)
{
int conn_fd;
struct sockaddr_in serv_addr;
char buf[1024];
conn_fd=socket(AF_INET,SOCK_STREAM,0);
if(conn_fd<0)
{
printf("create socket is failure %s\n",strerror(errno));
return -1;
}
printf("create socket number [%d]\n",conn_fd);
memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8555);
if(inet_pton(AF_INET,argv[1],&serv_addr.sin_addr)==0)
{
printf("ip addr is failure:%s\n",strerror(errno));
return -1;
}
printf("begin to connecting\n");
if(connect(conn_fd,(const struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)
{
printf("connect is failuren %s\n",strerror(errno));
return -2;
}
printf("connect is sucess\n");
write(conn_fd,"hello",5);
memset(buf,0,sizeof(buf));
read(conn_fd,buf,sizeof(buf));
printf("receive : %s\n ",buf);
close(conn_fd);
return 0;
}
[ligang@MiWiFi-R3P-srv ~]$ gcc my_socket_server.c
[ligang@MiWiFi-R3P-srv ~]$ ./a.out
create socket fd [3]
memset
begin to bind
begin to listen
begin to accepting!
read message is hello
begin to accepting!
^C
[ligang@MiWiFi-R3P-srv ~]$ gcc my_socket_client.c
[ligang@MiWiFi-R3P-srv ~]$ ./a.out 192.168.0.139
create socket number [3]
begin to connecting
connect is sucess
receive : welcome
[ligang@MiWiFi-R3P-srv ~]$ ./a.out 192.168.0.1
create socket number [3]
begin to connecting
connect is failuren Connection refused