socket编程 不指定端口

lengyuecanqiu 2011-10-17 04:11:07

现在正在做一个设计,需要socket通信。众所周知,socket通信需要指定ip地址和端口号,我现在需要在客户端能随意设置一个端口号,然后服务器能获得这个端口号然后连接通信。
有哪位大侠知道具体的思路。。。最好能有相应的程序,谢谢了!!!
...全文
576 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengyuecanqiu 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 skylkj 的回复:]
本来本地端口就可以是随意的,只是你要连接的服务器端口必须是固定的。 就好比你写信给服务器,你总要知道服务器的地址(IP)和门牌号码(端口)吧, 至于你的信是从哪边寄出的(客户端的IP和端口),不影响连接的建立
[/Quote]

最后一段是wrap.h
lengyuecanqiu 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 skylkj 的回复:]
本来本地端口就可以是随意的,只是你要连接的服务器端口必须是固定的。 就好比你写信给服务器,你总要知道服务器的地址(IP)和门牌号码(端口)吧, 至于你的信是从哪边寄出的(客户端的IP和端口),不影响连接的建立
[/Quote]

下面是我的程序,大侠指导下:
/* client.c */
#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//#include <sys/socket.h>
#include <netinet/in.h>
#include "wrap.h"

#define MAXLINE 80
#define SERV_PORT 1000

int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n;
//char *str;
// long SERV_PORT;
//printf("please input a port number:\n");
//scanf("%d",&SERV_PORT);
//printf("SERV_PORT:%d\n",SERV_PORT);


sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);

connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

while(fgets(buf,MAXLINE,stdin)!=NULL)
{
write(sockfd,buf,strlen(buf));
n=read(sockfd,buf,MAXLINE);
if(n==0) printf("the other side has been closed.\n");
else write(STDOUT_FILENO,buf,n);
}

close(sockfd);
return 0;
}

/* server.c */
#include <stdio.h>
#include <stdlib.h>
//#include <string.h>
//#include <unistd.h>
//#include <sys/socket.h>
#include <netinet/in.h>
#include "wrap.h"

#define MAXLINE 80
#define SERV_PORT 1000
int main(void)
{
struct sockaddr_in servaddr, cliaddr;
socklen_t cliaddr_len;
int listenfd, connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i, n;

listenfd = socket(AF_INET, SOCK_STREAM, 0);
printf("leng:%d\n",listenfd); //自己添加的,看看文件描述符的值。 这里的值为3

bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(listenfd, 20);
printf("Accepting connections ...\n");
while (1) {
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);


/*这一个死循环的作用是使服务器响应客户端的多次输入并进行处理*/
while(1){
n = read(connfd, buf, MAXLINE);
if(n==0){
printf("the other side has been closed.\n");
break;}
printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),ntohs(cliaddr.sin_port));

for (i = 0; i < n; i++)
buf[i] = toupper(buf[i]);
write(connfd, buf, n);
}
close(connfd);
}
}


#include <stdlib.h>

#include <errno.h>

#include <sys/socket.h>

void perr_exit(const char *s)

{

perror(s);

exit(1);

}

int Accept(int fd, struct sockaddr *sa, socklen_t *salenptr)

{

int n;

again:

if ( (n = accept(fd, sa, salenptr)) < 0) {

if ((errno == ECONNABORTED) || (errno == EINTR))

goto again;

else

perr_exit("accept error");

}

return n;

}

void Bind(int fd, const struct sockaddr *sa, socklen_t salen)

{

if (bind(fd, sa, salen) < 0)

perr_exit("bind error");

}

void Connect(int fd, const struct sockaddr *sa, socklen_t salen)

{

if (connect(fd, sa, salen) < 0)

perr_exit("connect error");

}

void Listen(int fd, int backlog)

{

if (listen(fd, backlog) < 0)

perr_exit("listen error");

}

int Socket(int family, int type, int protocol)

{

int n;

if ( (n = socket(family, type, protocol)) < 0)

perr_exit("socket error");

return n;

}

ssize_t Read(int fd, void *ptr, size_t nbytes)

{

ssize_t n;

again:

if ( (n = read(fd, ptr, nbytes)) == -1) {

if (errno == EINTR)

goto again;

else

return -1;

}

return n;

}ssize_t Write(int fd, const void *ptr, size_t nbytes)

{

ssize_t n;

again:

if ( (n = write(fd, ptr, nbytes)) == -1) {

if (errno == EINTR)

goto again;

else

return -1;

}

return n;

}

void Close(int fd)

{

if (close(fd) == -1)
perr_exit("close error");

}


ssize_t Readn(int fd, void *vptr, size_t n)

{

size_t nleft;

ssize_t nread;

char *ptr;

ptr = vptr;

nleft = n;

while (nleft > 0) {

if ( (nread = read(fd, ptr, nleft)) < 0) {

if (errno == EINTR)

nread = 0;

else

return -1;

} else if (nread == 0)

break;

nleft -= nread;

ptr += nread;

}

return n - nleft;

}

ssize_t Writen(int fd, const void *vptr, size_t n)

{

size_t nleft;

ssize_t nwritten;

const char *ptr;

ptr = vptr;

nleft = n;

while (nleft > 0) {

if ( (nwritten = write(fd, ptr, nleft)) <= 0) {

if (nwritten < 0 && errno == EINTR)

nwritten = 0;

else return -1;

}

nleft -= nwritten;

ptr += nwritten;

}

return n;

}

static ssize_t my_read(int fd, char *ptr)

{

static int read_cnt;

static char *read_ptr;

static char read_buf[100];

if (read_cnt <= 0) {

again:

if ( (read_cnt = read(fd, read_buf,

sizeof(read_buf))) < 0) {

if (errno == EINTR)

goto again;

return -1;

} else if (read_cnt == 0)

return 0;

read_ptr = read_buf;

}

read_cnt--;

*ptr = *read_ptr++;

return 1;

}

ssize_t Readline(int fd, void *vptr, size_t maxlen)

{

ssize_t n, rc;

char c, *ptr;

ptr = vptr;

for (n = 1; n < maxlen; n++) { if ( (rc = my_read(fd, &c)) == 1) {

*ptr++ = c;

if (c == '\n')

break;

} else if (rc == 0) {

*ptr = 0;

return n - 1;

} else

return -1;

}

*ptr = 0;

return n;

}
skylkj 2011-10-18
  • 打赏
  • 举报
回复
本来本地端口就可以是随意的,只是你要连接的服务器端口必须是固定的。 就好比你写信给服务器,你总要知道服务器的地址(IP)和门牌号码(端口)吧, 至于你的信是从哪边寄出的(客户端的IP和端口),不影响连接的建立
lengyuecanqiu 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qiuhui00 的回复:]
你不设置端口号,系统会自动分配一个随机的端口号给客户端,服务器端也能自己获取客户端的端口号,不需要你操心
[/Quote]

我现在不是不想设置端口号,是在客户端任意设置一个端口号,都能和服务器建立起连接。。。。
lengyuecanqiu 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 skylkj 的回复:]
服务器的ip端口固定,客户端随便你怎么弄,给服务器发消息(UDP)或者建立连接(TCP),服务器就能知道客户端的ip和端口了。然后就建立起通信了
[/Quote]

你具体操作过没有?

我试了一下,在客户端设置人机交互,提示输入端口号,当输入端口号后,客户端和服务器还是没有连接起来。。。。。
qiuhui00 2011-10-17
  • 打赏
  • 举报
回复
你不设置端口号,系统会自动分配一个随机的端口号给客户端,服务器端也能自己获取客户端的端口号,不需要你操心
当我遇上-你 2011-10-17
  • 打赏
  • 举报
回复
按照socket协议来
codesnail 2011-10-17
  • 打赏
  • 举报
回复
必须实现规定好吧。。。。。
skylkj 2011-10-17
  • 打赏
  • 举报
回复
服务器的ip端口固定,客户端随便你怎么弄,给服务器发消息(UDP)或者建立连接(TCP),服务器就能知道客户端的ip和端口了。然后就建立起通信了
LWIP UDP socket编程 可以指定本地端口号及发送长度不能太长问题分析

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧