2010-08-30 83 views
2

目前,我正在學習用C/C++ ...我有經驗。NET但不是在C的網絡編程(ESP:在UNIX網絡編程)recvfrom的 - 如何緩衝區轉換爲字符串

的問題我現在面對的是,當我收到消息時,我喜歡將它分成兩部分。消息的格式將類似於[command] filepath(例如:get a.txtput a.txt

我正在使用recvform來接收消息。

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, 
      struct sockaddr *from, int *fromlen); 

的問題是,我不知道如何「無效*迷」轉換爲字符串,這樣我可以做String.Split(」「),以獲得命令和文件名。

任何人都可以請解釋我一種將「void * buff」轉換爲字符串的方法嗎?

回答

1

實際上,您將指針指向字符數組的起始位置作爲緩衝區。系統調用recvfrom()寫入該數組。然後,您將數組作爲字符串處理 - 在確保它正確地以null結尾之後(其中recvfrom()不會這樣做)。當然,發送端必須以兼容的格式輸入數據,但recvfrom()會給你發件人寄給你的信息。

因此,直接的答案是「您不會將void *轉換爲字符串;您將字符串轉換爲void *並將其傳遞給recvfrom()」。

+0

謝謝。你的意思是,像下面那樣? char * message =「get a.txt」; returnStatus = SENDTO(sockd,消息,strlen的(的argv [3])+ 1,0, \t \t \t \t(結構sockaddr *)&xferServer,的sizeof(xferServer)); – 2010-08-30 16:56:30

+0

@Michael:是 - 或多或少......如果你這樣發送,調整strlen()以應用於消息而不是argv [3],那麼你需要包含尾隨NUL,因爲+1,然後recvfrom( )會有一個以null結尾的字符串傳入。 – 2010-08-30 17:54:27

0

C不是C++。沒有字符串類。 strtok函數可能會幫助你得到你想要的,假設你null手動終止你的緩衝區。

1

您需要一個字符緩衝區和緩衝區的大小。就像這樣:

char buf[1024]; 
const size_t buf_len = sizeof(buf); 

然後就可以調用recvfrom的,像這樣:

ssize_t r; 
r = recvfrom(sock, buf, buf_len-1, flags, &sock_from, &sock_from_len); 
if(r<0) { 
    handle_error(r); 
} else if(r == 0) { 
    handle_closed_socket(sock); 
} else { 
    buf[r] = '\0'; 
} 

buf[r] = '\0';將保證您的緩衝區是一個適當的空值終止的C字符串。然後你可以通過buf作爲一個字符串。

相關問題