C语言实现TCP编程
- 1.主机字节序和网络字节序
- 2.套接字的地址结构
-
- 3. TCP的网络接口
- 4. TCP服务器端的编程流程
- 5. TCP客户端的编程流程
- 6.运行结果
1.主机字节序和网络字节序
主机字节序: 不同的芯片,所采用的数值存储方式是不同:大端模式&小端模式
网络字节序: 统一使用大端模式来表示数据
2.字节序的转化
#include <netinet/in.h>
uint32_t ntohl (uint32_t __netlong); // 网络字节序转化为 主机字节序 long
uint16_t ntohs (uint16_t __netshort); // 网络字节序转化为主机字节序 short
uint32_t htonl (uint32_t __hostlong); // 主机字节序转化为网络字节序 long
uint16_t htons (uint16_t __hostshort); // 主机字节序转化 为网络字节序 short
2.套接字的地址结构
运行在两个不同主机上的进程想要通信: 必须知道 IP地址 端口号
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
};
struct sockaddr_in
{
sa_family_t sin_family;
uint16_t sin_port;
65535
struct in_addr sin_addr;
};
struct in_addr
{
uint32_t s_addr;
};
IP地址转化的方法
uint32_t inet_addr (const char *__cp); // 将点分十进制的字符串转化为uint32_t类型
char * inet_ntoa (struct in_addr __in); // 将struct in_addr类型的变量转化为char*字符串
3. TCP的网络接口
int socket (int __domain, int __type, int __protocol);
int bind (int __fd, struct sockaddr * __addr, socklen_t __len);
int listen (int __fd, int __n);
int accept (int __fd, struct sockaddr * __addr, socklen_t *__addr_len);
ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);
int connect (int __fd, struct sockaddr * __addr, socklen_t __len);
int close(int __fd);
4. TCP服务器端的编程流程
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
int listenfd = socket(AF_INET,SOCK_STREAM,0);
assert(listenfd != -1);
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port =htons(6000);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = bind(listenfd,(struct sockaddr*)&addr,sizeof(addr));
assert(res != -1);
res = listen(listenfd,5);
assert(res != -1);
while (1)
{
struct sockaddr_in cli_addr;
socklen_t cli_len = sizeof(cli_addr);
int c = accept(listenfd,(struct sockaddr*)&cli_addr,&cli_len);
if(c == -1)
{
printf("Get One Client Link Error\n");
continue;
}
while (1)
{
char buff[128] = {0};
int n = recv(c,buff,127,0);
if(n <= 0)
{
printf("Client will unlink\n");
break;
}
printf("%d : %s\n",c,buff);
send(c,"OK",2,0);
}
close(c);
}
close(listenfd);
return 0;
}
5. TCP客户端的编程流程
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
assert(sockfd != -1);
struct sockaddr_in ser_addr;
memset(&ser_addr,0,sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_port =htons(6000);
ser_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = connect(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
assert(res != -1);
while (1)
{
printf("input: ");
char buff[128] = {0};
fgets(buff,127,stdin);
if(strncmp(buff,"end",3) == 0)
{
break;
}
send(sockfd,buff,strlen(buff) - 1,0);
memset(buff,0,128);
recv(sockfd,buff,127,0);
printf("%s\n",buff);
}
close(sockfd);
return 0;
}
6.运行结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)