标签:addr 示例 ip 编程 client fd Linux include socket
linux网络编程示例
简单TCP、UDP编程示例。
TCP
- TCP客户端与服务器通信模型
- 服务器代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
const char ip[] = "127.0.0.1";
const int port = 9006;
//创建socket,使用IP协议(PF_INET)+TCP协议(SOCK_STREAM)
int fd_listen = socket(PF_INET, SOCK_STREAM, 0);
//绑定固定ip:port地址
in_addr_t ip_num = inet_addr(ip);
sockaddr_in addr_server = {AF_INET, port, ip_num};
bind(fd_listen, (sockaddr *)&addr_server, sizeof(addr_server));
//监听socket
listen(fd_listen, 10);
//接受客户端连接,并返回连接socket
sockaddr_in addr_client;
socklen_t len_client_addr = sizeof(addr_client);
int fd_conn = accept(fd_listen, (sockaddr *)&addr_client, &len_client_addr);
//接收客户端数据
printf("start receiving data...\n");
char buf[4096];
while (true)
{
memset(buf, '\0', sizeof(buf));
int ret = recv(fd_conn, buf, sizeof(buf) - 1, 0);
// recv返回0,表示客户端断开连接
if (ret == 0)
{
printf("connection closed\n");
break;
}
//打印接收的数据
printf("%s", buf);
}
//关闭socket
close(fd_conn);
close(fd_listen);
return 0;
}
- 客户端代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
const char ip[] = "127.0.0.1"; //服务器ip
const int port = 9006; //服务器port
//创建socket,使用IP协议(PF_INET)+TCP协议(SOCK_STREAM)
int fd_conn = socket(PF_INET, SOCK_STREAM, 0);
//连接服务器
in_addr_t ip_num = inet_addr(ip);
sockaddr_in addr_server = {AF_INET, port, ip_num}; //服务器地址
connect(fd_conn, (sockaddr *)&addr_server, sizeof(addr_server));
const char message[] = "hello world!\n";
for (int i = 0; i < 10; i++)
{
send(fd_conn, message, strlen(message), 0);
sleep(1);
}
//关闭socket
close(fd_conn);
return 0;
};
UDP
- UDP客户端与服务器通信模型
- 服务器代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
const char ip[] = "127.0.0.1";
const int port = 9006;
//创建socket,使用IP协议(PF_INET)+SOCK_DGRAM
int fd_socket = socket(PF_INET, SOCK_DGRAM, 0);
//绑定固定ip:port地址
in_addr_t ip_num = inet_addr(ip);
sockaddr_in addr_server = {AF_INET, port, ip_num};
bind(fd_socket, (sockaddr *)&addr_server, sizeof(addr_server));
//接收客户端数据
printf("start receiving data...\n");
//存放客户端地址
sockaddr_in addr_client;
socklen_t len_addr_client = sizeof(addr_client);
char buf[4096];
while (true)
{
//接收数据
memset(buf, '\0', sizeof(buf));
int ret = recvfrom(fd_socket, buf, sizeof(buf) - 1, 0, (sockaddr *)&addr_client, &len_addr_client);
char *ip_client = inet_ntoa(addr_client.sin_addr);
int port_client = addr_client.sin_port;
//打印接收的数据
printf("recived from %s:%d: %s\n", ip_client, port_client, buf);
}
//关闭socket
close(fd_socket);
return 0;
}
- 客户端代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
const char ip[] = "127.0.0.1";
const int port = 9006;
//创建socket,使用IP协议(PF_INET)+SOCK_DGRAM
int fd_socket = socket(PF_INET, SOCK_DGRAM, 0);
//绑定固定ip:port地址
in_addr_t ip_num = inet_addr(ip);
sockaddr_in addr_server = {AF_INET, port, ip_num};
bind(fd_socket, (sockaddr *)&addr_server, sizeof(addr_server));
//接收客户端数据
printf("start receiving data...\n");
//存放客户端地址
sockaddr_in addr_client;
socklen_t len_addr_client = sizeof(addr_client);
char buf[4096];
while (true)
{
//接收数据
memset(buf, '\0', sizeof(buf));
int ret = recvfrom(fd_socket, buf, sizeof(buf) - 1, 0, (sockaddr *)&addr_client, &len_addr_client);
char *ip_client = inet_ntoa(addr_client.sin_addr);
int port_client = addr_client.sin_port;
//打印接收的数据
printf("recived from %s:%d: %s\n", ip_client, port_client, buf);
}
//关闭socket
close(fd_socket);
return 0;
}
标签:addr,示例,ip,编程,client,fd,Linux,include,socket 来源: https://www.cnblogs.com/lazyfiish/p/16209269.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。