- scoket()指定各种协议
int socket(int domain, int type, int protocol);
![](https://i-blog.csdnimg.cn/blog_migrate/de708be0b6b34fa27f4ec206ac07bf09.png)
- bink()设置地址
![](https://i-blog.csdnimg.cn/blog_migrate/e4a103cdd5cce000e594fa7b54bfaaa3.png)
端口号port的设置
需要先把字节序给调整一下,把主机的字节序调整为网络字节序
字节序转换api有如下:
#include <netinet/in.h>
uint16_t htons(uint16_t host16bitvalue); //返回网络字节序的值
uint32_t htonl(uint32_t host32bitvalue); //返回网络字节序的值
uint16_t ntohs(uint16_t net16bitvalue); //返回主机字节序的值
uint32_t ntohl(uint32_t net32bitvalue); //返回主机字节序的值
h代表host,n代表net,s代表short(两个字节),l代表long(4个字节),通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。有时可以用INADDR_ANY,INADDR_ANY指定地址让操作系统自己获取
IP地址的结构体的设置
需要将主机的字符串型ip地址转换为网络的地址
地址转换API
int inet_aton(const char* straddr,struct in_addr *addrp);//把字符串形式的“192.168.1.123”转为网络能识别的格式
char* inet_ntoa(struct in_addr inaddr); //把网络格式的ip地址转为字符串形式
- listen()监听
listen(s_fd,10);
![](https://i-blog.csdnimg.cn/blog_migrate/27eba901f4317fd687d45ec7961b2cc6.png)
- accept()接收
![](https://i-blog.csdnimg.cn/blog_migrate/f097898ea3ff537040271e01c0cceb71.png)
- read()读
read(c_fd,readbuf,128);
- write()写
write(c_fd,"i get your message",128);
客户端:
socket 、connect 、 read 、write
显而易见,相比服务端,客户端少了几个API,多了一个connet
connet:
![](https://i-blog.csdnimg.cn/blog_migrate/4c14c1cd3477b3bcce6842276a32c5d1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/11d5f34c74b6ba652b61fbebda0ed160.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4d6ff49fc8e4d216bdf677817040893.png)
代码如下:
server:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
//int socket(int domain, int type, int protocol);
int main(int argc,char ** argv)
{
int s_fd;
int c_fd;
int n_read;
char readbuf[128];
char *msg ="i get message";
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
memset(&s_addr,0,sizeof(struct sockaddr_in));
// 1.socket
s_fd =socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
// 2.bind
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
bind(s_fd,(const struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
// 3.listen
listen(s_fd,10);
// 4.accept
// c_fd = accept(s_fd,NULL,NULL);
int clen = sizeof(struct sockaddr_in);
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
if(c_fd == -1){
perror("accept");
}
printf("connect sucess!\n");
// 5.read
n_read = read(c_fd,readbuf,128);
if(n_read == -1){
perror("read");
}else{
printf("get message:%d,%s\n",n_read,readbuf);
}
// 6.write
write(c_fd,msg,strlen(msg));
return 0;
}
~
client:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
//int socket(int domain, int type, int protocol);
int main(int argc,char ** argv)
{
int c_fd;
int n_read;
char readbuf[256];
char *msg ="From client";
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
// 1.socket
c_fd =socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
perror("socket");
exit(-1);
}
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
// connect
if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
perror("connect");
exit(-1);
}else{
}
write(c_fd,msg,strlen(msg));
// 5.read
n_read = read(c_fd,readbuf,256);
if(n_read == -1){
perror("read");
}else{
printf("get message:%d,%s\n",n_read,readbuf);
}
return 0;
}