Linux - 客户端开发(Ubuntu)
客户端开发
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1"
int main(int argc, char *argv[])
{
// 获取参数(欲向服务端发送的内容)
int sockfd; // 信箱
char *message;
struct sockaddr_in servaddr; // 标签,信封
int n;
char buf[64];
if(argc != 2) // 程序参数错误
{
fputs("usage: ./echo_client message\n", stderr);
exit(1);
}
message = argv[1];
//printf("message: %s\n", message);
// 创建邮箱
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 清空标签,写入地址和端口号
memset(&servaddr, '\0', sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr); // 欲发送的IP地址, 这里连接的是本地服务端,所以用127.0.0.1
servaddr.sin_port = htons(SERVER_PORT); // 发送至端口号
// 连接服务端
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 发送内容
write(sockfd, message, strlen(message));
// 读取服务端内容
n = read(sockfd, buf, sizeof(buf)-1);
if(n > 0)
{
buf[n] = '\0';
printf("receivs: %s\n", buf);
}
else
{
perror("error!\n");
}
close(sockfd);
return 0;
}
补充
- 如果自己写代码是时候报错了,可以在vim的命令模式里面用
:set nu
来显示文本行数。 - 服务端开启后,客户端连接输入输出正常,服务端没反应的话
- 可能是因为服务端可能有遗留后台线程在运行,可以用
ps -ef | grep a.out
(a.out为文件名)来查看是否后台有遗留线程,再使用killall a.out
(a.out为程序名)来结束这些遗留进程 - 还有一种方法,将服务端程序重新编译
- 可能是因为服务端可能有遗留后台线程在运行,可以用
测试连接
打开该程序需要带参数文本,例如./a.out "This a message text!"
使用方式:启动服务端,等待连接 -> 启动客户端程序,带参数