..当我跑步时:
gcc -o服务器-lpthread服务器.c
发生错误。 和:
gcc -o client -lpthread client.c
再次出现相同的错误。
我正在编写一个基于TCP的聊天室程序。
有server.c:
let frame = document.createElement('iframe');
//hide the iframe
frame.style.display = 'none';
//Must add iframe to DOM, otherwise contentWindow would be null.
document.body.appendChild(frame);
//lose built in fetch
fetch = () =>{};
//retrieve fetch from contentWindow property
window.fetch = frame.contentWindow.fetch;
//use fetch
fetch('http://example.com/movies.json')
.then(res=>res.json())
.then(json=>console.log(json))
.catch(err=>console.log('Error!'));
我真的不知道发生了什么。
这么长时间困扰我!!!请救救我!
答案 0 :(得分:0)
gcc -o server server.c -lpthread
答案 1 :(得分:0)
我找到了解决该问题的方法,这似乎是由于代码规范所致。当我在所有定义的函数(当然包括主函数)之间添加空白行时,我认为这应该是解决问题的关键。帮助gcc找到main函数的确切定义),然后再次编译链接。 新版本的server.c(只需添加空白行):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
int sockfd;//服务器socket
int fds[100];//客户端的socketfd,100个元素,fds[0]~fds[99]
int size =100 ;//用来控制进入聊天室的人数为100以内
char* IP = "192.168.255.255";
short PORT = 8000;
typedef struct sockaddr SA;
int pthread_create(
pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。
const pthread_attr_t *restrict attr, //线程属性,默认为NULL
void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行
void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。
);
void init(){
sockfd = socket(PF_INET,SOCK_STREAM,0);
if (sockfd == -1){
perror("创建socket失败");
exit(-1);
}
struct sockaddr_in addr;
addr.sin_family = PF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
if (bind(sockfd,(SA*)&addr,sizeof(addr)) == -1){
perror("绑定失败");
exit(-1);
}
if (listen(sockfd,100) == -1){
perror("设置监听失败");
exit(-1);
}
}
void SendMsgToAll(char* msg){
int i;
for (i = 0;i < size;i++){
if (fds[i] != 0){
printf("sendto%d\n",fds[i]);
send(fds[i],msg,strlen(msg),0);
}
}
}
void* service_thread(void* p){
int fd = *(int*)p;
printf("pthread = %d\n",fd);
while(1){
char buf[100] = {};
if (recv(fd,buf,sizeof(buf),0) <= 0){//阻塞与非阻塞recv返回值没有区分,都是 <0 出错 =0 连接关闭 >0 接收到数据大小
int i;
for (i = 0;i < size;i++){
if (fd == fds[i]){//遍历寻找那个关闭的连接
fds[i] = 0;
break;
}
}
printf("退出:fd = %dquit\n",fd);
pthread_exit((void*)&i);
}
//把服务器接受到的信息发给所有的客户端
SendMsgToAll(buf);
}
}
void service(){
printf("服务器启动\n");
while(1){
struct sockaddr_in fromaddr;
socklen_t len = sizeof(fromaddr);
int fd = accept(sockfd,(SA*)&fromaddr,&len);
if (fd == -1){
printf("客户端连接出错...\n");
continue;
}
int i = 0;
for (i = 0;i < size;i++){
if (fds[i] == 0){
//记录客户端的socket
fds[i] = fd;
printf("fd = %d\n",fd);
//有客户端连接之后,启动线程给此客户服务
pthread_t tid;
pthread_create(&tid,0,service_thread,&fd);
break;
}
if (size == i){
//发送给客户端说聊天室满了
char* str = "对不起,聊天室已经满了!";
send(fd,str,strlen(str),0);
close(fd);
}
}
}
}
int main(){
init();
service();
return 0;
}
然后:
gcc -o server server.c -plthread
它可以工作。 顺便说一句,我使用vscode添加一个新的.c文件。添加空白行后,.c文件将被识别为C文件。它的图标上带有一个巨大的C,之后又添加了空行。 just like this