我正在編寫一個連接到服務器的程序,獲取發送的數據並將其顯示到屏幕上。我正在爲使用ncurses
的程序創建UI。我初始化屏幕,連接到服務器,讀取套接字,打印輸出,關閉套接字,結束屏幕,這給我一個分段錯誤。在C中,爲什麼從套接字讀取會導致printw給出分段錯誤?
如果我跳過插座讀取,沒有錯誤發生,並顯示屏幕;但是,顯示之前有一段暫停。我想知道它是否與我的套接字是非阻塞的事實有關?
我有3個文件,main.c
socket.c
和screen.c
。我將截斷所需信息的文件。
的main.c
#include "socket.h"
#include "screen.h"
int main(int argc, char *argv[]){
screenInit();
socketConnect(argv[1], argv[2]);
sleep(1);
char buffer[1024];
socketRead(buffer, sizeof buffer);//commenting this out lets the screen display
screenDraw(buffer);
socketClose();
screenEnd();
return 0;
}
socket.c中
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
int sockfd;
int socketRead(char *output, int length){
memset(output, 0, length);
char buffer[1024];
memset(buffer, 0, sizeof buffer);
for(;;){
char *ch;
if(recv(sockfd, ch, 1, 0) == -1)
return -1;
if(strlen(buffer)+1 == sizeof buffer)
return -2;
strcat(buffer, ch);
if(*ch == '\n'){
if(strlen(buffer)+1 <= length){
strcpy(output, buffer);
return 0;
}else{
return -3;
}
}
}
}
int socketConnect(char *host, char *port){
//sockfd gets set here
fcntl(sockfd, F_SETFL, O_NONBLOCK);
return 0;
}
void socketClose(){
close(sockfd);
}
screen.c
#include <ncurses.h>
void screenInit(){
initscr();
cbreak();
noecho();
}
void screenDraw(char *string){
printw("%s", string);
refresh();
getch();
}
void screenEnd(){
endwin();
}
下面是堆棧
#0 0x00007ffff7647caa in ??() from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff7649191 in ??() from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff764b580 in malloc() from /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff7bce2de in _nc_printf_string() from /lib/x86_64-linux-gnu/libncurses.so.5
#4 0x00007ffff7bc93ef in vwprintw() from /lib/x86_64-linux-gnu/libncurses.so.5
#5 0x00007ffff7bca0e9 in printw() from /lib/x86_64-linux-gnu/libncurses.so.5
#6 0x000000000040111f in screenDraw()
#7 0x0000000000400d56 in main()
我想我在這裏添加我的Makefile以及如果由於某種原因,有一些東西做的問題。
的Makefile
objects = main.o socket.o screen.o
program: $(objects)
cc -Wall -o program $(objects) -lncurses
.PHONY: clean
clean:
@-rm -f program
是的,你最新的編輯是完全正確的。我想閱讀,直到我到一個換行。所以我做了這些改變,但我怎麼能追加char到緩衝區沒有strcat? NVM。快速谷歌搜索有很多答案。謝謝您的幫助。 =) – Aust
@還好你知道了。對不起我的沉默,不得不突然離開。 –