本文主要是介绍c版socketserver,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下面将编写一个c/s结构的程序,主要功能是client将向server发送一些消息,而当server收到client的请求时,并向client发送一条回应信息。
server.c代码如下:
#include <stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>#define SERVPORT 3333
#define BACKLOG 10
#define MAXSIZE 1024int main() {int sockfd,client_fd;struct sockaddr_in my_addr;struct sockaddr_in remote_addr;//创建套接字if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {perror("socket create failed!");exit(1);}//绑定端口地址my_addr.sin_family = AF_INET;my_addr.sin_port = htons(SERVPORT);my_addr.sin_addr.s_addr = INADDR_ANY;bzero(&(my_addr.sin_zero),8);if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {perror("bind error!");exit(1);}//监听端口if (listen(sockfd, BACKLOG) == -1) {perror("listen error");exit(1); }while (1) {int sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {perror("accept error!");continue;}printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));//子进程段if (!fork()) {//接受client发送的请示信息int rval;char buf[MAXSIZE]; if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {perror("reading stream error!");continue;}printf("%s\n",buf);//向client发送信息char* msg = "Hello,Mr hqlong, you are connected!\n";if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!");close(client_fd);exit(0);} close(client_fd);}return 0;
}
编译并启动服务
这里我们的server已经作为一个服务后台运行,如果想知道后台的服务的运行状态,可能使用netstat来查看.
hqlong@ubuntu:~/t$ netstat -nl | grep 3333
tcp 0 0 0.0.0.0:3333 0.0.0.0:* LISTEN
可以看出3333端口已经在监听,这说明服务已经启动。
为了测试server是否可以接受client的请求,可以使用telnet来进行测试。
hqlong@ubuntu:~$ telnet 127.0.0.1 3333
Trying 127.0.0.1...
Received a connection from 127.0.0.1
Connected to 127.0.0.1.
Escape character is '^]'.
test
test
Hello,Mr hqlong, you are connected!
Connection closed by foreign host.
可以看出,我们使用telnet来连接刚所启动的server,然后向该server发送了一条信息”test”,server收到了这条信息后,向client发送了一条响应信息,告诉我们,我们已经连接上了。
hqlong@ubuntu:~$ gcc server.c -o server
接下来来编写自己的client程序,完成的功能和上面的telnet的测试功能一样,向server发送一条信息,server在收到这条信息后,向client发送一条响应信息。
代码如下:client.c
#include < stdio .h>
#include < stdlib .h>
#include < errno .h>
#include < string .h>
#include < sys /types.h>
#include < netinet /in.h>
#include < sys /socket.h>
#include < sys /wait.h>#define SERVPORT 3333
#define MAXDATASIZE 100
#define SERVER_IP "127.0.0.1"
#define DATA "this is a client message"int main(int argc, char* argv[]) {int sockfd, recvbytes;char buf[MAXDATASIZE];struct hostent *host;struct sockaddr_in serv_addr;if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket error!");exit(1);}bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERVPORT);serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {perror("connect error!");exit(1);}write(sockfd,DATA, sizeof(DATA));if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {perror("recv error!");exit(1);}buf[recvbytes] = '\0';printf("Received: %s",buf);close(sockfd);return 0;
}
hqlong@ubuntu:~$ gcc client.c -o client
hqlong@ubuntu:~$ ./client
Received a connection from 127.0.0.1
Hello,Mr hqlong, you are connected!
Connection closed by foreign host.
以上就是整个服务器端和客户端程序的编写。
。服务器程序建立了一个socket,并调用bind函数将此socket 和本地协议端口联系起来,然后用listen和accept函数将此socket参数置于被动的监听模式并接收到建立连接。
客户程序也建立一个socket,接着调用connect函数启动网络对话。在客户和服务器建立连接以后,就可以用read、write等函数进行通信了。
这篇关于c版socketserver的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!