首先说明一点,无论是服务器还是客户端,都要注意接受、发送数据数组的大小,一定要≤接收方数组的大小,避免出现莫名其妙的问题。下面是代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<netinet/in.h>
#include<unistd.h>
#define DEFAULT_PORT 8000
#define MAXLINE 4096
int main(int argc, char** argv)
{
int socket_fd, connect_fd;
struct sockaddr_in servaddr;
char buff[4096];
int n;
//初始化Socket
if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//初始化
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
servaddr.sin_port = htons(DEFAULT_PORT);//设置的端口为DEFAULT_PORT
//将本地地址绑定到所创建的套接字上
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
//开始监听是否有客户端连接
if( listen(socket_fd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("======waiting for client's request======\n");
while(1){
//阻塞直到有客户端连接,不然多浪费CPU资源。
if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
while(1){
//接受客户端传过来的数据
n = recv(connect_fd, buff, MAXLINE, 0);
if (n < 0) {
printf("发送失败!\n");
break;
}
else{
printf("客户端信息:%s\n",buff);
}
printf("请输入回复信息:");
char tem[50];//
scanf("%s",tem);
int sned_len = send(connect_fd,tem,50,0);
if(sned_len<0){
printf("发送失败\n");
break;
}
}
close(connect_fd);
}
close(socket_fd);
}
因为是在Linux下写的服务器,所以代码风格偏向于C语言。而客户端是在Windows下的,无论是QT自带的、还是控制台的winsock写法都可以成功连接。因为是第一次书写跨平台的,碰到不少问题,所以记录一下,以便以后翻看。