这是我的C客户端代码。不知何故,它不工作。它在我尝试传递参数时起作用。
我希望程序要求用户给hostname
然后它会要求portname
,然后发送消息:C socket程序错误
Enter hostname: localhost
Enter portname: 56456
Enter message : Hi user
Enter message : What's up
Enter message : How are you
而且一旦给了它不应该要求再次(直到重新启动该程序的主机和端口)。我试着用do while
循环,但它不工作。 在服务器上会显示已发送的邮件
这里是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg)
{
perror(msg);
exit(0);
}
//int main(int argc, char *argv[])
int main()
{
char *argv[256];
int argc;
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
printf("\n\nEnter Hostname\n\n");
fgets(argv[0],256,stdin);
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
//buffer = tempFunc();
fgets(buffer,255,stdin);
printf("\n\nHere Goes the output\n%s",buffer);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
return 0;
}
代码不匹配给定的输出。 'do while'循环在哪里? – Coconop 2014-09-02 12:12:07
我删除了这个,如果你想我会添加它 – 2014-09-02 12:13:18
你尝试使用多路复用器,如选择,轮询或epoll。你应该阅读一下,因为这个任务很简单。 – 2014-09-02 12:16:12