用socket程序接受顺序用户输入
我今天的问题是关于套接字编程。我正在开发一个程序,创建一个客户机和一个服务器,客户机通过给定的命令与服务器数据库中的记录进行交互。我对socket编程非常陌生,我已经得到了一些入门代码,可以让服务器和客户端连接起来并进行交互。也就是说,在发出“stop”命令之前,我非常不熟悉为了接收和发送另一条消息需要迭代上述代码的哪一部分。在此之前,我希望用户能够继续向服务器发送消息 (相关)服务器代码:用socket程序接受顺序用户输入,c,sockets,C,Sockets,我今天的问题是关于套接字编程。我正在开发一个程序,创建一个客户机和一个服务器,客户机通过给定的命令与服务器数据库中的记录进行交互。我对socket编程非常陌生,我已经得到了一些入门代码,可以让服务器和客户端连接起来并进行交互。也就是说,在发出“stop”命令之前,我非常不熟悉为了接收和发送另一条消息需要迭代上述代码的哪一部分。在此之前,我希望用户能够继续向服务器发送消息 (相关)服务器代码: void error(char *msg) { perror(msg); exit(1)
void error(char *msg)
{
perror(msg);
exit(1);
}
int main () {
int num = 1;
int del;
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
/*STEP 1*********************************************/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
/*Make sure opening was successful*/
if (sockfd < 0)
error("ERROR opening socket");
/*STEP 2********************************************
0 out the server address*/
memset((char *) &serv_addr, 0, sizeof(serv_addr));
/*convert argument to int*/
portno = PORTNO;
/*this is always the same for this type of connection*/
serv_addr.sin_family = AF_INET;
/*INADDR_ANY is a macro that will find the current machine IP*/
serv_addr.sin_addr.s_addr = INADDR_ANY;
/*make sure byte order is correct
may be a no-op, but better safe than sorry*/
serv_addr.sin_port = htons(portno);
/*STEP 3********************************************/
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0) {
error("ERROR on binding");
}
/*STEP 4********************************************
Open server up for listening, if you don't listen
you won't hear*/
listen(sockfd,5);
/*STEP 5******************************************/
clilen = sizeof(cli_addr);
/*Accept blocks until a connection with
a client is made. Returns a new socket
to communicate with the new connection.
Also receives address data about client*/
/*Communicate************************************/
char *array[20];
do {
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
memset(buffer, 0, 256);
printf("%s", "Enter Message:");
n = read(newsockfd,buffer,255);
printf("I read %d\n",n);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
int i = 0;
char *p = strtok(buffer, " ");
while (p != NULL)
{
array[i++] = p;
p = strtok (NULL, " ");
}
if (strcmp(array[0], "put") == 0) {
insert(&front, array);
puts("PUT COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "lname") == 0) {
puts("GET LNAME COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "fname") == 0) {
puts("GET FNAME COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "SID") == 0) {
puts("GET SID COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "GPA") == 0) {
puts("GET GPA COMMAND");
} else if (strcmp(array[0], "delete") == 0 && strcmp(array[1], "SID") == 0) {
puts("DELETE COMMAND");
} else {
printf("%s\n", "Not a valid command.");
}
} while (strcmp(array[0], "stop") != 0);
return 0;
}
void错误(char*msg)
{
佩罗尔(味精);
出口(1);
}
int main(){
int num=1;
int del;
int sockfd、newsockfd、端口号;
socklen_t clilen;
字符缓冲区[256];
服务地址中的结构sockaddr\u,cli\u addr;
int n;
/*第一步*********************************************/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
/*确保开业成功*/
if(sockfd<0)
错误(“打开套接字时出错”);
/*步骤2********************************************
0输出服务器地址*/
memset((char*)&serv_addr,0,sizeof(serv_addr));
/*将参数转换为int*/
portno=portno;
/*对于这种类型的连接,这始终是相同的*/
serv_addr.sin_family=AF_INET;
/*INADDR_ANY是一个宏,它将查找当前机器IP*/
serv_addr.sin_addr.s_addr=INADDR_ANY;
/*确保字节顺序正确
可能是一个没有行动,但安全总比抱歉好*/
serv_addr.sin_port=htons(端口号);
/*步骤3********************************************/
如果(绑定(sockfd,(结构sockaddr*)和服务地址,
sizeof(服务地址))<0){
错误(“绑定错误”);
}
/*步骤4********************************************
如果您不侦听,请打开服务器进行侦听
你不会听到的*/
听(sockfd,5);
/*步骤5******************************************/
clilen=sizeof(cli_addr);
/*接受块,直到与
创建了一个客户端。返回一个新套接字
以与新连接通信。
还接收有关客户端的地址数据*/
/*沟通************************************/
字符*数组[20];
做{
newsockfd=接受(sockfd,
(结构sockaddr*)和cli_addr,
&克莱伦);
if(newsockfd<0)
错误(“接受错误”);
内存集(缓冲区,0,256);
printf(“%s”,“输入消息:”);
n=读取(newsockfd,缓冲区,255);
printf(“我读了%d\n”,n);
如果(n<0)错误(“从套接字读取错误”);
printf(“这是消息:%s”,缓冲区);
n=写(newsockfd,“我收到你的消息”,18);
if(n<0)错误(“写入套接字错误”);
int i=0;
char*p=strtok(缓冲区“”);
while(p!=NULL)
{
数组[i++]=p;
p=strtok(空,“”);
}
if(strcmp(数组[0],“put”)==0){
插入(&前面,数组);
puts(“PUT命令”);
}else if(strcmp(数组[0],“get”)==0&&strcmp(数组[1],“lname”)==0){
puts(“获取LNAME命令”);
}else if(strcmp(数组[0],“get”)==0&&strcmp(数组[1],“fname”)==0){
puts(“获取FNAME命令”);
}else if(strcmp(数组[0],“get”)==0&&strcmp(数组[1],“SID”)==0){
puts(“获取SID命令”);
}else if(strcmp(数组[0],“get”)==0&&strcmp(数组[1],“GPA”)==0){
puts(“获取GPA命令”);
}else if(strcmp(数组[0],“delete”)==0&&strcmp(数组[1],“SID”)==0){
puts(“删除命令”);
}否则{
printf(“%s\n”,“不是有效命令”);
}
}while(strcmp(数组[0],“stop”)!=0);
返回0;
}
(相关)客户代码:
#define PORTNO 20321
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
void error(char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
/*set up ints for socket file descriptor
port number and return of read/write*/
int sockfd, portno, n;
int i;
/*structure for server info*/
struct sockaddr_in serv_addr;
/*used to hold the return of the function
that finds our server address, will
be copied into serv_addr*/
struct hostent *server;
/*for our message*/
char buffer[256];
/*make sure usage is correct*/
if (argc < 2) {
fprintf(stderr,"usage %s hostname\n", argv[0]);
exit(0);
}
/*convert our port number*/
portno = PORTNO;
/*create the socket*/
sockfd = socket(AF_INET, SOCK_STREAM, 0);
/*make sure it was made*/
if (sockfd < 0)
error("ERROR opening socket");
/*gethostbyname takes our host domain name and
resolves it to an address, there is a similar
function, gethostbyaddr that takes an address
and returns the same struct, struct hostent*/
server = gethostbyname(argv[1]);
/*make sure the host exists*/
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
/*0 out the server address stuct and set members*/
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
/*copy the data returned from gethostbyname
into the server address struct*/
memcpy((char *)server->h_addr_list,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
/*Request a connection to the server through the socket we set up
make sure it connected, this function will also do the binding
of our socket and server info*/
if (connect(sockfd,(struct sockaddr*) &serv_addr,sizeof(serv_addr)) < 0) {
error("ERROR connecting");
}
for (i = 0; i < 3; i++) {
printf("Choose an operation: \n 1. put ln,fn,mi,SID,GPA\n 2. get lname\n 3. get fname\n 4. get SID\n 5. get GPA\n 6. delete (SID)\n 7. stop\nChoice: ");
/*Retrieve a message to send from the user*/
memset(buffer, 0, 256);
fgets(buffer,255,stdin);
/*send the message to the socket*/
printf("length is %d\n", (int)strlen(buffer));
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
memset(buffer, 0, 256);
/*await an incoming message, read stops all process*/
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
return 0;
}
}
#定义端口号20321
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(字符*消息)
{
佩罗尔(味精);
出口(0);
}
int main(int argc,char*argv[])
{
/*为套接字文件描述符设置int
端口号和读/写返回*/
int sockfd,端口号,n;
int i;
/*服务器信息的结构*/
服务地址中的结构sockaddr\u;
/*用于保存函数的返回
找到我们的服务器地址,威尔
被复制到服务地址*/
结构主机*服务器;
/*为了我们的信息*/
字符缓冲区[256];
/*确保用法正确*/
如果(argc<2){
fprintf(stderr,“使用%s主机名\n”,argv[0]);
出口(0);
}
/*转换我们的端口号*/
portno=portno;
/*创建套接字*/
sockfd=套接字(AF_INET,SOCK_STREAM,0);
/*确保它是制造的*/
if(sockfd<0)
错误(“打开套接字时出错”);
/*gethostbyname接受我们的主机域名和
解析为一个地址,有一个类似的
函数,获取地址的gethostbyaddr
并返回相同的结构,struct hostent*/
server=gethostbyname(argv[1]);
/*确保主机存在*/
如果(服务器==NULL){
fprintf(stderr,“错误,没有这样的主机\n”);
出口(0);
}
/*0输出服务器地址并设置成员*/
memset((char*)&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
/*复制从gethostbyname返回的数据
进入服务器地址结构*/
memcpy((char*)服务器->地址列表,
(char*)和serv_addr.sin_addr.s_addr,
服务器->h_长度);
serv_addr.sin_port=htons(端口号);
/*通过我们设置的套接字请求与服务器的连接
确保它已连接,此函数也将执行绑定
我们的套接字和服务器信息*/
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0){
错误(“E
while (true)
{
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
while (true)
{
memset(buffer, 0, 256);
printf("%s", "Enter Message:");
n = read(newsockfd,buffer,255);
printf("I read %d\n",n);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
int i = 0;
char *p = strtok(buffer, " ");
while (p != NULL)
{
array[i++] = p;
p = strtok (NULL, " ");
}
if (strcmp(array[0], "put") == 0) {
insert(&front, array);
puts("PUT COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "lname") == 0) {
puts("GET LNAME COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "fname") == 0) {
puts("GET FNAME COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "SID") == 0) {
puts("GET SID COMMAND");
} else if (strcmp(array[0], "get") == 0 && strcmp(array[1], "GPA") == 0) {
puts("GET GPA COMMAND");
} else if (strcmp(array[0], "delete") == 0 && strcmp(array[1], "SID") == 0) {
puts("DELETE COMMAND");
}
// Checking for stop command here
else if (strcmp(array[0], "stop") ==0)
{
close(newsockfd);
break;
}
else {
printf("%s\n", "Not a valid command.");
}
}
}