socket学习记录
/*tcp_server.c
*服务器编程流程:
* 1.创建socket ----> socket()
* 2. 绑定IP和端口号 ----> bind()
* 3. 设定最大连接数 ----> listen()
* 4. 阻塞监听客户端连接 ----> accept()
(会返回新的文件描述符,用于与客户端通信)
* 5. 使用完毕后,关闭socket ----> close()
* (此程序用于演示流程,把close写在while外面,实际上没有关闭)
*
* 至此,前面执行成功的话,服务器就建立好了,后面就可以读写信息了
*以下示例程序实现:
*①将客户端的IP地址和端口号打印出来;
*②服务器将接收到的数据打印到屏幕;
*③服务器将接收到的小写字母转换成大写字母返回给客户端
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>
#define SERV_PORT 9527
#define BUFFSIZE 1024
int main(void)
{
int lfd, cfd, res;
char buff[BUFFSIZE], client_ip[1024];
struct sockaddr_in serv_addr, client_addr; //查看结构体 man 7 ip
socklen_t client_addr_len;
//打开一个网络通讯端口,返回文件描述符,后续与服务器建立连接使用
lfd = socket(AF_INET, SOCK_STREAM, 0);
if (lfd == -1)
{
printf("socket error!");
}
serv_addr.sin_family = AF_INET; //AF_INET IPv4协议
serv_addr.sin_port = htons(SERV_PORT); //htons把无符号短整形主机字节顺序转变为网络字节顺序,实际上就是将计算机的小端格式转为网络字节序的大端格式
//此处为端口号,使用man htons查看详情
serv_addr.sin_addr.s_addr =htonl(INADDR_ANY); //INADDR_ANY宏表示本地的任意IP地址
res = bind(lfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(res == -1)
{
printf("bind error!");
}
listen(lfd, 128); //128为最大上限数
client_addr_len = sizeof(client_addr);
cfd = accept(lfd, (struct sockaddr*)&client_addr, &client_addr_len); //阻塞监听客户端连接
if(cfd == -1)
{
printf("accept error!");
}
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
printf("client ip:%s port:%d\n",inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip)),
ntohs(client_addr.sin_port));
printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:>>>>>>\n");
//如果建立连接成功,则开始进入数据处理(用户自定义)
while(1)
{
res = read(cfd, buff, sizeof(buff));
write(STDOUT_FILENO, buff, res); //写到屏幕上
for (int i =0; i< res; i++)
{
buff[i] = toupper(buff[i]); //转换成大写再写回buff
}
write(cfd, buff, res); //写res个到buf中
}
close(lfd);
close(cfd);
}
/*tcp_client.c
*客户端编程流程:
* 1.创建socket ----> socket()
* 2. 与服务器建立连接 ----> connect()
* 3. 使用完毕后,关闭socket ----> close()
* (此程序用于演示流程,把close写在while外面,实际上没有关闭)
*
* 至此,前面执行成功的话,客户端与服务器就建立好了,后面就可以读写信息了
*以下示例程序实现:
* 发送小写hello到服务器,服务器接收到后转为大写,发回给客户端,客户端接收并打印到屏幕上
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <netinet/in.h>
#include <stdio.h>
#include <arpa/inet.h>
#define SERV_PORT 9527
#define BUFFSIZE 1024
#define SEVER_IP "172.21.94.59" //填写你自己服务器绑定的IP地址,ifconfig查看
#define SERVER_PORT 9527 //服务器绑定的端口号
int main(void)
{
int sockfd;
int i, n;
char *str="hello\n";
char rec_buf[BUFFSIZE];
struct sockaddr_in servaddr;
/* char buff[BUFFSIZE], client_ip[1024]; */
/* struct sockaddr_in serv_addr, client_addr; //查看结构体 man 7 ip
socklen_t client_addr_len; */
//打开一个网络通讯端口,返回文件描述符,后续与服务器建立连接使用
sockfd = socket(AF_INET, SOCK_STREAM, 0); //IPV4 TCP
if (sockfd == -1)
{
printf("socket error!");
}
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, SEVER_IP, &servaddr.sin_addr); //将IP转换后放入servaddr.sin_addr中
servaddr.sin_port = htons(SERVER_PORT); //转换端口
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
while(1)
{
//printf("client is wiitting!\n");
write(sockfd, str, strlen(str));
n = read(sockfd, rec_buf, BUFFSIZE);
write(STDOUT_FILENO, rec_buf, n);
}
close(sockfd);
}