我正在研究连接到用户指定的公共服务器的网络客户端程序.如果用户给我一个连接的主机名,它同时具有IPv4和IPv6地址(通常是包含两者A和AAAA记录的DNS名称),我不知道应该如何决定应该连接哪个地址.
问题是,机器支持IPv4和IPv6是很常见的,但只能通过IPv4实现全局连接.最常见的情况是仅配置IPv6链路本地地址.目前我能想出的最佳选择是:
我可以通过选项1看到的问题是连接可能不会立即失败 - 可能需要很长时间才能超时.
我有一个我复制和编辑过的脚本.如果可能的话,我需要解释几行.
这些是:
read -p "please enter the username you wish to create: " username
if id -u $username >/dev/null 2>&1; then
Run Code Online (Sandbox Code Playgroud)
怎么read -p办?怎么id -u办?怎么>/dev/null 2&1;办?然后在脚本中进一步说明这条线:
sudo useradd -g $group -s $bash -d $homedir -m $username -p $password
Run Code Online (Sandbox Code Playgroud)
再次,请有人解释这一行中的所有减号吗?(-g,-s,-d,-m,-p)
在Linux中,当您进行阻止i/o调用(如读取或接受)时,实际发生了什么?
我的想法:进程从运行队列中取出,在某个等待队列上进入等待或阻塞状态.然后当建立tcp连接(用于接受)或硬盘驱动器准备就绪或读取文件时,会引发硬件中断,让那些进程等待唤醒并运行(在文件读取的情况下,如何linux知道要唤醒什么进程,因为可能有很多进程在等待不同的文件?).或者也许不是硬件中断,单个进程本身轮询以检查可用性.不确定,有帮助吗?
作为回答另一个问题的一部分,我遇到了一段这样的代码,gcc编译时没有抱怨.
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我一直用来构造指向自己的类型的方法(例如,链接列表),但我一直认为你必须命名结构,以便你可以使用自引用.换句话说,您无法xyz *z在结构中使用,因为此时typedef尚未完成.
但是这个特定的样本没有命名结构,它仍然编译.我原本认为编译器中有一些黑魔法会自动翻译上面的代码,因为结构和typedef名称是相同的.
但是这个小小的美也可以:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?这似乎是一个明显的违规,因为没有任何struct NOTHING_LIKE_xyz类型定义.
当我从指针更改为实际类型时,我得到预期的错误:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
Run Code Online (Sandbox Code Playgroud)
此外,当我删除struct,我得到一个错误(parse error before "NOTHING ...).
这是否允许在ISO C中?
更新:A struct NOSUCHTYPE *variable;也编译,因此它不仅仅是内部结构似乎是有效的.我在c99标准中找不到任何允许结构指针宽大的东西.
我正在使用以下代码在字符串中首次出现一个字符.但是当角色太长或者我正在搜索的角色在很远的程度上需要一些时间,这会延迟其他操作.我怎么能解决这个问题.代码如下.
注意:attrPtr是一个char *包含对包含'"'远程字符的字符串的引用.
int position = 0;
char qolon = '"';//character to search
while (*(attrPtr + position++) != qolon);
char* attrValue = NULL;
attrValue = (char*)malloc(position * sizeof(char));
strncpy(attrValue, attrPtr, position-1);
Run Code Online (Sandbox Code Playgroud) 我有一些代码我在cygwin(使用GCC)下编写成功使用gethostbyname(); 但是当我尝试直接使用解析器来检索DNS服务器的IP地址时,它失败了(nsaddr_list []中的所有条目都为null,nscount为-1).如果gethostbyname()正在工作,那么显然它能够连接到DNS服务器.
这段代码......
if (res_init() == -1) {
fprintf(stderr,"res_init() failed\n");
exit(1);
}
if (_res.nscount <= 0) {
fprintf(stderr,"nscount = %d\n",_res.nscount);
}
else {
for(i=0;i<_res.nscount;i++) {
fprintf(stderr, "dnssrvr: %d.%d.%d.%d\n",
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff) >> 0,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff00) >> 8,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff0000) >> 16,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff000000) >> 24);
}
}
Run Code Online (Sandbox Code Playgroud)
适用于unix/linux,但在cygwin上返回nscount = -1.使用cygwin/gcc时获取DNS服务器有什么技巧吗?
我多次被告知volatile无法优化对对象的访问,但在我看来,C89,C99和C11标准中的这一部分建议不然:
...实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用).
如果我理解正确,这句话就说明实际的实现可以优化表达式的一部分,只要满足这两个要求:
在我看来,很多人都把"包括"的含义与"排除"的含义混为一谈.
编译器是否可以区分"需要"的副作用和不需要的副作用?如果时间被认为是一个必要的副作用,那么为什么允许编译器优化掉像/ do_nothing();或类似的空操作int unused_variable = 0;?
如果编译器能够推断函数什么都不做(例如void do_nothing() { }),那么编译器是否可能有理由优化对该函数的调用?
如果编译器能够推断出一个volatile对象没有被映射到任何关键的东西(也许它被映射/dev/null到形成一个空操作),那么编译器是否也可能有理由来优化那个非关键的副作用远?
如果编译器可以执行优化来消除不必要的代码,例如do_nothing()在称为"死代码消除"的过程中调用(这是很常见的做法),那么为什么编译器也不能消除对空设备的易失性写入?
据我所知,编译器可以优化对函数或易失性访问的调用,或者由于5.1.2.3p4,编译器也无法优化掉.
我想暂停pthreads,但显然,没有像pthread_suspend这样的函数.我在某处读到了使用互斥锁和条件暂停pthreads并使用如下:
#include <pthread.h>
class PThread {
public:
pthread_t myPthread;
pthread_mutex_t m_SuspendMutex;
pthread_cond_t m_ResumeCond;
void start() {
pthread_create(&myPthread, NULL, threadRun, (void*)this );
}
Thread() { }
void suspendMe() {
pthread_cond_wait(&m_ResumeCond,&m_SuspendMutex);
}
void resume() {
pthread_cond_signal(&m_ResumeCond);
}
};
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么我们需要互斥和条件来暂停和恢复pthread.是否可以在不使用条件的情况下暂停和恢复它?
完全披露,我是学生,这是一项任务.我已经工作了一个多星期几乎不停(除了以前花的时间),我无法弄清楚我做错了什么.我的服务器一直挂在epoll_wait后,只有"少数" RECVS完成("少数",因为我期待几个GB的数据和我得到的只有几十MB).我不认为我的客户端如何工作有任何问题,因为它与我的选择和多线程服务器一起工作得很好.请快速浏览一下,让我知道是否有任何事情因为我的问题导致你跳出来.
客户端/服务器的基本思想是用连接(10k +)轰炸服务器并多次传输给定数量的数据.这个epoll服务器在2000年遇到了麻烦,当时我的多线程服务器只处理了10k的目标.
我不是要求你为我做任务(我差不多完成了)我只是需要帮助弄清楚我在这里做错了什么.在此先感谢您提供的任何帮助:)
1 #include "common.h"
2 #include <sys/epoll.h>
3
4 uint16_t ready[MAX_CONNS];
5 uint16_t next;
6 pthread_mutex_t mutex;
7
8 void *worker_thread(void *param) {
9 int my_sock, pos;
10 struct conn_params *conn_ps = (struct conn_params *)param;
11
12 while (1) {
13 pthread_mutex_lock(&mutex);
14
15 while (1) {
16 if (next == MAX_CONNS) {
17 printf("balls\n");
18 next = 4;
19 }
20
21 if (ready[next] != 0) {
22 pos = next;
23 my_sock = ready[pos]; …Run Code Online (Sandbox Code Playgroud) 我试图了解mmap的工作原理.mmap的用户级调用如下所示.
void *mmap(void *addr, size_t len, int prot, int flags,
int fildes, off_t off);
Run Code Online (Sandbox Code Playgroud)
但特定设备驱动程序的内核级别mmap如下所示:
int <device_name>_mmap(struct file*fp, struct vm_area_struct *vma)
Run Code Online (Sandbox Code Playgroud)
我也查看了源代码,但我无法找到它们之间的连接.
特定设备的mmap如何获取其参数"struct vm_area_struct*vma"?你能帮我理解一下吗?感谢您的帮助.