[英]Sending data in socket server using C
我是網絡初學者,正在嘗試學習編寫簡單的服務器。 我嘗試使用 linux 手動命令編寫一個簡單的套接字服務器。 我有幾個問題。 是否可以將數據作為客戶端發送到服務器,然后再次將數據從服務器傳遞到客戶端? 此外,每當我運行我的服務器時,我都會收到這個奇怪的消息,不知道為什么。
另外,我可以在我的代碼中改進什么?
服務器:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char* argv[]) {
int socket_serv;
char response[256] = "Connected to server";
socket_serv = socket(AF_INET, SOCK_STREAM, 0);
if(socket_serv == -1) {
perror("Error connecting to server");
}
struct sockaddr_in socket_addr;
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = htons(8080);
socket_addr.sin_addr.s_addr = INADDR_ANY;
bind(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
listen(socket_serv, 50);
accept(socket_serv, NULL, NULL);
send(socket_serv, response, sizeof(response), 0);
return 0;
}
客戶:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]) {
int socket_serv;
socket_serv = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in socket_addr;
socket_addr.sin_family = AF_INET,
socket_addr.sin_port = htons(8080);
socket_addr.sin_addr.s_addr = INADDR_ANY;
int status = connect(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
if(status == -1) {
perror("cant connect");
}
char server_res[256];
recv(socket_serv, &server_res, sizeof(server_res), 0);
printf("Data from server: %s", server_res);
close(socket_serv);
return 0;
}
在服務器中, accept
function 應該在循環中:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char* argv[]) {
int socket_serv;
char response[256] = "HTTP/1.1 200 OK\nContent-Length: 20\n\nConnected to server\n";
socket_serv = socket(AF_INET, SOCK_STREAM, 0);
if(socket_serv == -1) {
perror("Error connecting to server");
}
struct sockaddr_in socket_addr;
socket_addr.sin_family = AF_INET;
socket_addr.sin_port = htons(8080);
socket_addr.sin_addr.s_addr = INADDR_ANY;
bind(socket_serv, (struct sockaddr*) &socket_addr, sizeof(socket_addr));
listen(socket_serv, 50);
for (;;) {
int fd = accept(socket_serv, NULL, NULL);
printf("accepted socket: %d\n", fd);
// read request
char rbuf[512];
read(fd, rbuf, 512);
printf("%s", rbuf);
// send response
send(fd, response, strlen(response), 0);
close(fd);
}
return 0;
}
循環接受並處理新的連接。 請注意, send
發送 strlen(response) 字節,而不是全部 256 個字節。
我在這里放了一read
。 理想情況下, read
應該在循環中讀取所有到達的數據包。
用curl -v 127.0.0.1:8080
測試它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.